What is Virtualizing?

ID:V1 What is Virtualizing?
Quarterdeck Technical Bulletin #229
by Michael Bolton and Eric Wieling

Q. What is virtualizing?
Q. What does "virtualize text and graphics" mean?
Q. What does "writes directly to screen" mean?
Q. How can I tell if my program writes directly to screen?
Q. I've set "Runs in background" to Y.  Why isn't my program running in
   background?


Q. What is virtualizing?

Programs can handle display in three ways in DESQview parlance.  These
are explained in more detail below, but briefly,

1) the "well-behaved" application uses DOS or your system's BIOS
   services to display its information;

2) the "DESQview-aware" program writes directly to the screen when not
   running under DESQview, but writes to a special area of memory (under
   DESQview's control) so that DESQview may properly manage display of
   multiple windows.

3) the "misbehaved" application writes directly to the screen hardware
   with no consideration for DESQview or any other multitasking
   environment.

Misbehaved applications present a special problem for most multitasking
environments, in that direct screen-writing can "bleed through" into
foreground windows.   However, on a 386 processor, DESQview 386 (which
is simply DESQview and QEMM running on the same computer) can
"virtualize" misbehaved applications; that is, it can fool these
applications into believing that they have exclusive control of the
screen.  Thus, such applications may be run in background or in a small
window without interfering with the display of other applications.

The first thing to know about virtualizing is that, unless you are
working on a 386, 386SX, or i486 machine, AND using DESQview 386,
virtualizing means little to you; anything less than a 386 is not
capable of virtualizing the screen, and only DESQview and QEMM (which
together comprise DESQview 386) provide the memory-mapping services
that allow this trick to be performed.  This is another of the many
compelling reasons to move to a 386 processor if you have not already
done so.  (For the purposes of this discussion, the 80386SX, the 80386
(also known as the 80386DX), and the i486 are equivalent; all provide
the memory-management features of the 386.)

Now that we've established that we discuss virtualization only when we
refer to a 386, we should look at the way programs display information
on the screen.

From DESQview's perspective, there are two basic types of programs, as
far as display is concerned. The first type of program, the
"well-behaved" program in DESQview parlance, uses DOS or the system's
Basic Input/Output Services (BIOS) to put text on the screen.  The BIOS
gets information from the program, and then puts values into screen
memory addresses; these values are then translated by the display
adapter to show up as the characters that you see on your monitor.
"Well-behaved" applications, then, use resources built into the system
to display information.  To run a program in a small window or in
background, DESQview (without QEMM's help, and on any processor)
intercepts DOS and BIOS calls and places the results into a "virtual
screen."  This is an area of memory, or "buffer," the same size as
screen memory, which, to the application, looks and feels exactly like
the real screen.  The application therefore behaves as it would if it
had the computer all to itself.  The "well- behaved" program believes
that display work has been done, and continues about its business
without complaints.

Applications which display Hercules, CGA, EGA, or VGA graphics (and this
includes all programs with graphical user interfaces) normally do not
use the BIOS.  Because of the greater complexity involved in displaying
graphics, such programs do not have the option of writing directly to a
DESQview memory buffer, nor are there BIOS services efficient enough to
allow such programs to run at a satisfactory speed.  These applications
are therefore, by definition, NOT well-behaved and are called
(predictably) "misbehaved" in DESQview parlance.  This type of program
avoids DOS and the BIOS, and puts text or graphics on the screen itself
by writing values directly into screen memory addresses.

For text-based applications, writing directly to the screen hardware is
considerably faster than using BIOS calls, so many text applications
write directly to in the interests of speed.  Graphics-oriented BIOS
functions are limited in power and flexibility, and in any case are
unacceptably slow, so graphical applications write directly to the
screen.

The DESQview-aware program checks for the presence of DESQview (or
Microsoft Windows, or TopView, an IBM environment with which DESQview is
compatible) and asks for the address of the memory buffer that DESQview
will use to store the program's video information.  The program then
writes directly to DESQview's memory buffer instead of to the video
hardware.  This method produces the same well-governed results as
writing through DOS or the BIOS, and is considerably faster.  This type
of application is called "DESQview-aware."

Writing directly to screen memory addresses eliminates the middleman,
but the catch is that direct-to-screen display information cannot be
intercepted and redirected as easily as BIOS calls.  Under anything
other than DESQview-386, such programs will not run smoothly in
background or in a small window.  These programs interact directly with
the display hardware, and will write outside the borders of their
DESQview windows; if allowed to run in background or in a small window,
these programs will "leak" or "bleed" into the display windows of other
programs.  The alternative is to suspend the operation of this type of
program while it is in background, which is DESQview's default method of
managing such programs.  This is quite satisfactory for those who want
to use DESQview as a task-switching environment, but not for those who
desire multitasking.

Happily, the 386 processor, QEMM-386, and DESQview, all working
together, can trap the direct screen writes of misbehaved text or
graphics programs and redirect the output of these applications to
DESQview's video buffers -- also called "virtual screens," since as far
as the application knows, it is writing to the screen.  This process is
called "virtualizing." The advantage of virtualizing is that, under
DESQview 386, misbehaved text programs and even programs using Hercules,
CGA, EGA, or VGA graphics can run comfortably in background or in a
small window.


Q. What, then, is the difference between "virtualizing text" and
   "virtualizing text AND graphics"?

First, memory usage: a memory buffer for a virtualized text screen only
takes up as much memory (in bytes) as there are places to display a
character on the screen. That works out to 80 (columns) X 25 (rows) X 2
bytes per character (one byte for the character, and the other for its
display attribute), for a total of 4000 bytes.  If you want to create a
virtual screen to catch text-based data, you won't pay much of a memory
penalty.  DESQview uses expanded memory to virtualize video output, and
expanded memory can only be allocated in 16K chunks (called "pages").
Consequently, it costs 16K, rather than 4000 bytes, of expanded memory
to virtualize a text program.  If you want to virtualize graphics,
though, you'll need as much as 272K of available expanded memory,
depending on the graphics mode that the program is using.

Second, there is a difference in the use of the processor's time.  A
virtualized text program is approximately as fast as a nonvirtualized text
program, but virtualizing graphics does take a heavy toll on the processor.
Incidentally, when you are running a virtualized program full-screen and in
foreground, DESQview temporarily suspends virtualization and lets the program
write to the real video memory region; in this circumstance, there is
little extra processor overhead.

Third, it is worth noting that under DESQview 386, even protected mode
programs, also known as DOS-extended programs, can be multitasked,
thanks to a memory-management specification, coauthored by Quarterdeck,
called the Virtual Control Program Interface (VCPI).  It is possible in
most circumstances to virtualize the text output of a program that runs
in protected mode.  This is because most protected mode programs
actually switch into real mode to write text to the screen.  However,
programs which write graphics directly to the screen while in protected
mode cannot be virtualized, so DESQview 386 will by default halt the
operation of such programs when they are not using the full screen.  A
newer specification for multitasking, the DOS Protected Mode Interface,
will allow virtualization of protected-mode programs; future versions of
DESQview and QEMM are expected to support this specification.


Q.  How can I tell if my program is writing directly to screen?

To tell if an application is writing directly to the video hardware
inside DESQview, make the following changes in the application's Change
a Program menu:

1) Set "Writes text directly to screen" to N;

2) Set "Virtualize text/graphics" to N;

3) On the Advanced Options screen, blank out the following four fields
in the "Window Position" section: Starting Height, Starting Width,
Starting Row, and Starting Column.  Put blanks in these fields, not
zeros.

After these changes have been made, open the program. DESQview will
place a small window border on the screen; if the program comes up and
stays within the small window border, it does not write directly to the
screen.  If the program demolishes the window border and takes the full
screen, it is writing directly to the hardware, and should be
virtualized if you wish to run it in background or in a small window.

Q. Why doesn't my program STAY in background?  It bleeds through on to
the screen when it's background; even though I've set "Runs in
background" to Y, the information from this program keeps showing up in
the foreground window.

If it is an application that writes text or graphics directly to screen,
one reason might be that it is not set up to virtualize.  You can amend
this by

1) selecting Change a Program from the DESQview Open Window
   Menu,

2) selecting the program that you want to change, and

3) on page one of the Change a Program Menu, setting "Virtualize text
and graphics" to Y or T.


Q.  When should I virtualize both text and graphics?

If an application does work which you want to continue while the
program is in background or in a small window, and it is a program
that does this work while displaying graphics, set "Virtualize text
and graphics" to Y.

Q. When should I virtualize text only?

1) If you have an application which writes text directly to the screen,
but never uses graphics, set Virtualize to T.  Misbehaved text-based
applications are good candidates for this treatment.

2) If you have an application which does write both text and graphics
directly to the screen, but in which you have no need to run the program
in background while graphics are being displayed, set Virtualize to T. A
good example of this type of program is a word processor or a
spreadsheet which has a graphical element to it (a charting or print
preview module, for example) that you never need to run in background or
in a small window.  Even if you're not virtualizing this type of
program, you can still place your chart or print preview in a small
window -- the program simply halts, while retaining the information on
screen.  You can still use DESQview's screen management to see all the
parts of the screen you like, but the program's operation is suspended
while it's in the small window. Recalculating and printing, since they
usually take place while the screen is in text mode, can typically
continue to run in background in such programs, since the text mode of
the program is being virtualized.

3) If you have an application which writes text in real mode, but writes
graphics to the screen while in protected mode, again set "Virtualize
text and graphics" to T.  Do this because the program can still be
virtualized while it's in text mode, even though it can't be virtualized
while it's displaying graphics.

Q. I've done all these things and my program STILL won't run in
background. What's wrong?

There are a few possibilities.

You may have set "Virtualize Text and Graphics" on Page 1 of the
program's Change a Program Menu to N.

Solution: set Virtualize Text and Graphics to Y

You may simply be out of memory; when DESQview virtualizes an
application's graphics, it can require up to 272K of free expanded
memory.

Solution: make sure that you have enough memory available for
virtualizing.  If you have several applications open, close down one or
more.  You might also want to consider upgrading your system by adding
more memory.

DESQview 386 cannot virtualize if you have set the Expanded Memory Page
Frame to 0 with QEMM's FRAME=NONE or FRAMELENGTH=0 parameters.

Solution: make sure neither of the above parameters are on the QEMM line
in CONFIG.SYS.

Although DESQview can save and restore most video modes, there are a few
that it can't virtualize.

Solution: try using a lower resolution for the program in question. Text
mode, sometimes known as "CGA mode" for some programs, is a good place
to start.  "CGA mode" is something of a misnomer, since you'll
actually still get your normal resolution on an EGA or VGA -- the
program just writes to the screen without being in graphics mode.

To virtualize graphics, you may need more graphics pages.

Solution: on the Advanced Options screen of the Change a Program Menu,
set Graphics Pages to a higher number, such as 2 or 3.

You may not have enough Real Alternate Maps to virtualize a large number
of windows.

Solution:   QEMM must provide DESQview with a Real Alternate Map for
each virtualized window.  Since QEMM's default number of Real Alternate
Maps is 8, if you are using more than 8 windows, you'll be unable to
virtualize window 9.  Close down an application or two, or specify
MAPS=n on the QEMM line in CONFIG.SYS, where n is a number larger than
8.  Numbers larger than 20 are unlikely to be helpful.

Programs that start as part of a DESQview startup script, and are put
into background by the script, may not virtualize if they change video
modes; when the video mode changes, they will be suspended.

Solution: for this type of program, make sure that "Runs in Background"
is set to Y, and is not left blank.

A program may be grabbing a hardware interrupt, and may write directly
to screen from inside its hardware interrupt handler.

Solution: in this unusual circumstance, use Manifest in TSR mode, and
then load your program.  Look at Manifest's First Meg / Interrupts
screen to determine the software interrupt which corresponds to the
hardware interrupt the program is grabbing.  When you want to run this
program under DESQview, use the DESQview startup parameter /HW:nn:V,
where nn is the number, in hexadecimal, of the software interrupt above.
This will allow DESQview to virtualize screen writes that occur
inside the hardware interrupt handler.


Finally, it should be noted that DESQview 386 is presently the only
program in existence that will multitask and virtualize misbehaved DOS
applications which use EGA and VGA graphics.  Virtualization is one of
the principal ways by which DESQview can multitask these applications;
understanding the above ideas about virtualization can help you to take
the greatest advantage of DESQview's power.

This technical note may be copied and distributed freely as long as it is
distributed in its entirety and it is not distributed for profit.
        Copyright (C) 1991 by Quarterdeck Office Systems
             * * *   E N D   O F   F I L E    * * *

Comments

Popular posts from this blog

BOTTOM LIVE script

Fawlty Towers script for "A Touch of Class"