This document was exported from WP 5.0 and some of the formatting codes were lost (especially footnotery). Please pardon the occasional anomalies especially out-of-place "1"s which were originally superscripted (footnote). MEMORY EXPANSION IN 80x86-BASED COMPUTERS UNDER MS-DOS prepared by John Wilson, Hyperdyne, Inc. Annandale, VA IN THE BEGINNING ... In the beginning, the was the 8080 microprocessor. The 8080 was, defendably, the "first" microprocessor.1 When the 8080 was invented, memory for computers was very expensive. The 8080 could directly address 64 thousand bytes of information, which was a very great deal in those days. Few systems (or more correctly, few system owners) could afford to actually place a full 64 K of memory in their systems. But things changed quickly. The Silicon Valley guys learned to make transistors smaller and better and it became much more economically feasible to talk about fully populated 64K machines. On the software front, things like spreadsheets and word processors were being invented. These programs were hungry for memory and the microcomputer user rapidly outgrew the 64K box. Before going on with the story, a little digression into the origins of the 64K limit. This limit was the direct result of the fact that the CPU chip had only 16 address lines. The address lines are a set of wires coming out of the CPU which allow the CPU to indicate what item of memory it wants to read or write. In most computers, the size of the "pieces" are bytes, or 8-bit characters. These 16 wires are called the Address Bus. The voltages on the 16 address lines are interpreted as a binary number (with the first pin representing the 1's place, the second pin representing the 2's place, the third pin representing the 4's place, etc.) the resultant number is the Address being addressed by the CPU. The number of distinct patterns of 16 things, each of which can have two values, is 2 raised to the 16th power, or 65536. This number is 64 times the quantity "1K" which is 1024. (Early on, programmers engineers decided to use the "K" as a unit of counting things like memory because it was a nice power of two and figured it was close enough to a "real" thousand that nobody would notice). The point of this story is that the original microprocessors could only address 64K because of the simple reason that they only had 16 address lines. Why didn't they just build one with more address lines? Well its not that simple. Those address lines had to have circuitry driving them, and other circuitry to actually generate the 16-bit addresses, and other circuitry to decode the new instructions that would use more than 16 bits, and so on, and so on. And this circuitry was made of transistors. And, unfortunately, the state of the art of chip manufacturing did not allow chips to be built with many more transistors. So, mankind waited for the silicon boys to learn how to fit more transistors on one raisin-sized chip. Meanwhile, back the ranch, The Intel Corporation, in a stroke of electromarketing genius took the basic 8080 architecture and doubled up a small portion of the internal workings of the CPU's address circuitry. They basically duplicated the address register (the transistors that hold the pattern of bits to place on the address bus), slid it left 4 bits, and added some simple circuitry to add it arithmetically to the "old" address register. An so was born the infamous Intel Segment Register. By making this simple kluge to the 8080, Intel created the 8086 and 8088 microprocessors which now effectively had TWENTY address lines and could therefore address 2 to the 20th locations, a little over one million bytes. This new unit was called a Megabyte even those it was further away from a million than a "K" was from a thousand, but then again you bought the "K", didn't you? The 20 bit address bus allowed the new amazing spreadsheets to really do some amazing things. This, in turn allowed Intel to beat competitor Motorola to the marketplace (who were expanding the address bus the "right" way in their 68000 family). This in turn led IBM to select the Intel family over Motorola's as the basis of their new PC, and the rest is history. Using the power of the 8088, the Microsoft corporation adapted the CP/M operating system to the new chip, and, using its new power, created MS-DOS. Because of a lot of reasons, the 8088 and MS-DOS took over the world. And everyone was happy. Except ..... the programmers kept getting more bold in the ways they found to use memory, and the users wanted still BIGGER spreadsheets, and started playing with things like CAD/CAM, DBMSs, Artificial intelligence, desktop publishing, etc, all of which had insatiable appetites for memory. The silicon boys kept up with the hunger by developing bigger and better CPUs, the 80286, 80386, 80486 etc.). These 80286 had a 24-bit address bus and could therefore address 16 MB of memory directly. No one could possibly want to put that much actual memory in a PC, right? In a pre-emptive first strike, they also created 80386 which had a 32-bit address bus and could therefore address 2 to the 32 bytes or over 4 billion bytes! (Pow! Bam! Take THAT, Power User). The day had finally come when the CPUs sitting on desktops could finally address more memory than anyone could afford to buy. ----------- 1 Yes, there was an 8008, and a 4004 before that, but their only, surviving significance today is that they were the predecessors of the 8080. ---------- End of problem, right? Wrong. Unfortunately, there were millions and millions of the 20-bit machines out there now (in the mid-1980's). Probably more significantly there were hundreds of millions of dollars invested in MS-DOS software that did not know how to use the new 32-bit instructions and capabilities. Especially MS-DOS. (Unix and OS/2 and a number of other less well- known operating environments do use the 32-bit mode, but MS-DOS was still king). Because Intel wanted to sell more than 3 of these new chips, they wisely decided to build "modes" into the new chips to make them compatible with MS-DOS. A Mode is essentially a switch, inside the CPU that turns it into another chip, insofar a all logical functionality is concerned. So when you're running MS-DOS on your shiny new 386 or 486, you're still running with only 20 bits of address and consequently a 1 MB address space. This mode is called real mode and the lower 1 MB of addressable memory in real mode is called conventional memory. The solution? EMS or Expanded Memory Specification. EXPANDED MEMORY Expanded memory is a way to allow more than 1 MB of memory to be used by MS-DOS applications. How can this be? The CPU can only address 1 million different addresses; how can I have more than one MB in my PC? The answer is that the CPU re-uses the same address to get to more than one byte of data. It does this by allowing any one address to actually be used to reference several, distinct, physically different storage locations - but only one at a time, of course. EMS memory usually resides on special "EMS cards", like the AST "RAMPage". (I say usually because there are some clever ways of implementing EMS on 80286 and 80386 machines that don't use "special" EMS cards; this is discussed later in the section entitled "Software Approaches to EMS"). The EMS card has memory chips on it just like regular system memory cards. The difference is that the memory chips on the card are not connected directly to the CPUs address bus. These chips are actually wired to another address bus, totally contained on the card, that has more than 20 address bits, usually 24 or so. Where do these extra address bits come from? Well some of them are just passed-through systems address bits. The rest come from special storage locations onboard the EMS card, called page registers. How are these page registers loaded? These registers are themselves directly addressable by the CPU. To access a byte of data in EMS memory, the CPU first loads the page register (itself simply another location accessible by the CPU) and then makes a normal memory reference. Some of the bits come from the address bus, and the rest come from the bits previously squirreled away in the page registers. Thus, it can be seen that a given address on the regular CPUs address bus forms only part of the address needed to select a particular byte of memory on the EMS card. To uniquely identify a byte, you need to specify the regular address plus the contents of the page register. It follows that one CPU address can correspond to several EMS memory locations, each of which differs only by the contents of the page register. The CPU can thus access more than 1 MB of memory on the EMS card by using its normal address bus augmented by the page registers. HOW IT ALL FITS TOGETHER In the early versions of EMS, all EMS memory was mapped to appear to be in a special address range in the range of all possible addresses accessible by the CPU. This was usually at addresses between D0000 and DFFFF (in hexadecimal notation). This includes exactly 64KB possible addresses. This area of address space is called the Page Frame, an analogy to a frame around a picture. The page frame is logically divided into 4 16KB "pages".1 When we say that the EMS memory is "mapped" into this range, what we mean is that the EMS card does not respond to any addresses outside this range. When an address is placed on the address bus ---------- 1 For the sake of simplicity in the following discussion, the multi-page nature of the page frame will not be mentioned further. The explanations apply to each page within the page frame individually. It should also be noted that, strictly speaking, the 4-page, 64 KB page frame applies only to EMS versions 3.2 and earlier. In EMS 4.0+, the page frame is not limited to just 4 pages and can, in fact, be all or partially located within the 640 KB address range normally occupied by conventional RAM. This feature is used by various multitasking overlays to DOS, such as Desqview, which actually allow program code to be paged in and out. ---------- outside this range, the EMS board remains totally passive, just like it was not plugged in at all. When the CPU asserts an address within this range, the EMS board comes to life and responds like regular memory. When the CPU references the EMS address space, the CPUs address bits are used along with the page register bits to actually specify which EMS byte to access. The net effect is to make the EMS card memory appear as a series of "banks" which can be made (one at a time) to masquerade as "real" system memory at a certain address in the range D0000-DFFFF hex. These banks are called EMS pages. Within each page, the practically any byte addressed is selected by the system address bus bits that were passed through by the EMS circuitry. The particular page selected is determined by what value was previously written into the EMS page registers. All the physical EMS memory locations that respond to a common value in the page registers are said to be in the same page. That is, once that special value is loaded into the page register, any of those locations can be accessed by the CPU using normal memory read/write instructions. If another value is loaded into the page registers, a totally different set of EMS memory bytes (i.e, physically different transistors) are made to respond to the same CPU addresses as before. The model that this behavior suggests is that the EMS memory, divided up into 16K pages, exists out in limbo somewhere, and is unable to be addressed by the CPU in any way. The CPU can however invoke the right magic to instantaneously plug any one of these disembodied pages right into its addressable memory space. The magic consists of loading the Holy Page Register. The CPU can, with equal ease, banish that same page back into limbo, by putting a different value in the page registers. The thing that makes this magic useful is that, any data stored in an EMS page is faultlessly remembered even after it has been banished to zombie land. And, furthermore, that data can be read by the CPU just by remapping it into the address space. This means that an MS-DOS program can juggle megabytes of memory resident data using just 20 address bits in good old 8088 real mode. Of course at any one given instant, most of that data is in zombie land, but no matter, it can be called back from the netherworld with a simple, hardware-assisted incantation in microseconds. EMS MEMORY MANAGERS OR DRIVERS Each manufacturer of an EMS board is free to actually design the actual circuitry of his EMS board to suit his whim, his engineers, and his marketing plan. Most boards are different in a real, physical way from one another. The magic incantations necessary to shuffle EMS pages between here and Hoboken is different for each one. Does each application program need to know which particular brand/model of board is plugged in and what its religion is? Fortunately not. Enter the Enhanced Memory Specification. EMS is a specification of a standardized way that applications interact with EMS hardware. This interaction is via the software interrupt feature of the 8088/MS-DOS. All applications that wish to use EMS memory call interrupt 67H the same way with the same arguments, no matter who made the board. When the interrupt is issued, control passes to the memory resident EMS management software, usually called either an EMS memory manager or EMS driver (same thing). This piece of software is unique to each brand of board and is normally supplied by the boards vendor. It is the express purpose of this piece of software to turn the standard EMS invocation arguments into the particular set of hardware incantations understood by the board. Beware mixing boards and drivers from different sources! This may work in rare circumstances but will eventually lead to consumption of excessive amounts of alcoholic beverages. EXTENDED MEMORY OK. Now we know how EMS works: it expands a selected 64KB- sized range of addresses in the CPUs address space to several megabytes by paging-in one chunk at a time. But what about "Extended Memory"?. Actually extended memory is a much simpler concept. Remember those unused address lines in the 80286 and 80386? (MS-DOS and other real-mode applications only use the first 20 of the 80286's 24 and the 80386's 32). They were not put there for decoration. The CPU can be put in Protected Mode and can then use those extra address lines to address megabytes and megabytes of memory without needing the help of the special EMS hardware like page registers and private (EMS-card) address busses. In protected mode, the CPU can address all physical memory in the same, natural way. In fact, the one megabyte boundary loses all significance, except for the painful memory of what it used to be like back in that awful 20-bit real mode. Extended memory is thus just like conventional memory, just extended up to higher addresses. The down side is, of course, that MS-DOS does not know how to switch into protected mode, and wouldn't know what to do there if it did. Rectifying this shortcoming, and all its implications, is the sole reason for OS/2. SOFTWARE APPROACHES TO EMS IMPLEMENTATION The discussion of EMS so far has talked exclusively about hardware approaches to EMS. In the 8088, hardware must be employed to supplement the deficiencies of that chip. In the 80286 and 80386, however, there are software-only methods to give the same functionality as EMS hardware. Both approaches use extended memory for the storage of EMS page data. In the 80286, EMS memory contents are brought into the 1 MB, conventionally-addressable range by physically copying 16 KB blocks of memory to and from extended memory. The EMS "page" that the application program sees is actually a block of conventional memory that has been filled with the contents of a block of extended memory. The copying is done by a piece of software known as an EMS Emulator (driver) which is usually loaded like other DOS device drivers in CONFIG.SYS. Note that to access the extended memory, the EMS Driver must switch into protected mode, copy the data, then hightail it back into real-mode to keep DOS happy. The extended memory blocks, in this scheme, are emulating a block of memory that would normally be physically resident on the EMS card. Note that these are not really "paged"-in in the same sense as true EMS pages, nor is there any "mapping" going on. All physical memory contents retain their actual addresses as far as the CPU is concerned, only there contents are copied back and forth. The advantage of this scheme is that EMS functionality can be achieved in machines without actual EMS hardware. A disadvantage of this scheme is its performance. Whole 16K blocks must be moved to access a new page (which takes milliseconds), in contrast to "true" EMS where just a page register must be loaded (which takes microseconds). Another disadvantage is the fact that some precious conventional memory is consumed by the emulated page frame. In the 80386, the solution is much more elegant. In true EMS, the contents of the page registers can be thought of as a memory- mapping table. That is, the contents of the page register, in essence, point to a particular block of EMS-card-resident memory - change the page register contents and a new physical page shows up in the page frame. The 386 was designed for operating systems much more sophisticated than MS-DOS; these operating systems take for granted the presence of memory mapping capability. The 80386 has, in fact, an internal memory mapping facility much more sophisticated than the crude, bank-oriented page registers of an EMS card. The 386's memory management unit allows any arbitrary- sized chunk of physical memory to be mapped to anywhere in the address space, including the lower 1 MB. And, most importantly, to the address were an EMS-aware application expects to find the page frame and the EMS pages contained therein. With the 80386, hardware within the CPU performs the mapping previously done by EMS hardware. Programming of the CPUs mapping registers is performed by a device driver usually known as an Expanded Memory Manager. Memory managers are written to run on the (standard) 80386 and not some particular vendor's EMS hardware. This allows third-party vendors to produce EMS emulators for any 80386. Examples are "QEMM-386" by Quarterdeck Systems and "386-to-the-Max" by Qualitas. Finally, there is one more software approach to EMS that can be used with any machine. That approach is called Virtual EMS and employs a system's hard disk as storage for EMS pages. A device driver intercepts EMS calls in much the same way as the approach described above for the 80286, except that copying is done between a page frame in conventional memory, and sectors of your hard disk. This is a clever approach, and allows EMS memory to be much greater than the amount of memory in your machine, but, because disk is thousands of times slower than semiconductor memory, this approach should only be used by the terminally desperate. APPENDIX - SUMMARY FOR USERS EMS is the specification of a software technique for making more than 640 KB (the normal DOS limit) available to your programs. Put simply, EMS reserves a block of memory space in your PC and allows a block of RAM (usually resident on an EMS card) to be switched into that address range. There are generally many identical blocks of RAM present on the EMS card, each and any one of which can be "plugged" in -- only one at a time. Your CPU can use one of these blocks to store data in, and then switch in another block, store data in that, switch in yet another block, and so on, and so on. Later, the CPU can recall these blocks in the same or different order and read back the original data. In many ways, this performs the same function as your system's disk -- except that it's all done in solid-state memory and is thousands of times faster. There are four approaches to actually implementing EMS, depending to some extent, on what type of machine you have. These approaches are: - an EMS memory card (like the AST "Rampage") [any DOS computer, but usually 8088s or 80286s] - an EMS emulator [80286 or 80386, but usually only on 80286's] - an Extended Memory Manager [386 only] (for example Quarterdeck System's "QEMM-386 or Qualitas's "386- to-the-Max" ) - a Virtual Memory Manager [any DOS machine] An EMS memory card is more than just a memory expansion card: it contains special circuitry to perform the bank-switching operation discussed above. To use an EMS card, you will have to perform two steps: (1) Configure the EMS card hardware to match your computer's configuration and (2) install a special EMS card driver for the board in your CONFIG.SYS file. Details and procedures differ for different makes and models of EMS cards. Consult your EMS card's users manual for instructions. Note that drivers are usually card- specific; you cannot, in general, use Vendor A's driver with Vendor B's card. Not all "memory" expansion cards are EMS cards. There is another type of memory called extended memory which is used by other operating systems such as OS/2 and Unix. It is also used by a few DOS utilities, most notably IBM's VDISK RAM disk emulator. If your computer is advertised as having more than 640 KB of memory installed, it's a good bet that it's extended memory and not EMS memory. Few applications can use extended memory, although by using a software technique which will be discussed in a moment, extended memory can be made to serve as EMS memory. Before deciding on an EMS strategy, determine the type of memory your computer already has installed. Be forewarned: IBM, as usual, has a different name for extended memory (like everything else). They call it (you guessed it) expanded memory. So, if you bought it from IBM, and it's called expanded memory, it's extended memory. Everyone else pretty much sticks to standard nomenclature but to be sure, look for the phrase "EMS x.x compliant" in the documentation, where x.x is usually a number like 3.2 or 4.0. ---------- 1 The 'S' in EMS stands for "Specification". EMS is not a particular way to build EMS memory, rather, it is the specification of a software interface to it. Different vendors can, and do, implement EMS differently. What is the same, however, is the way that applications programs interface to this memory. ---------- Many EMS cards allow the memory contained on them to be configured as all EMS memory, all extended memory, or a mixture. If you use VDISK or any other special programs that use extended memory, you may wish to reserve part of the board's memory for use as extended memory. Otherwise, there's really no good reason for not configuring all of your memory as EMS. (Note that EMS boards are generally more expensive than "plain" extended memory boards because of the additional circuitry required). Consult your board's users manual for the proper switch settings or software settings to give the mix you desire. EMS cards can be used in any machine, but are usually found in 8088s and 80286s because there is a better and cheaper way to go in 80386s as will be discussed below. EMS EMULATORS A less common approach to implementing EMS in your computer is a EMS Emulator. This is a software-only approach that requires no special hardware to use. It essentially turns extended memory into expanded memory. Unfortunately, there is a price for this magic - performance. Because extended memory lacks the special hardware to switch its address like the blocks of memory on an EMS card, this software must copy whole blocks of data (16 KB's worth) back and forth between your program and extended memory every time a new block is required -- even if it's just to read a single byte. Depending on the nature of the program, this can be a few times slower or hundreds of times slower than "true" EMS. This is not a recommended solution for that reason, however, if necessary, it can be used. This approach can only be used on 80286 and 80386 machines which have extended memory. Machines based on the 8088 (like the original PC and XT) cannot accommodate extended memory. On the 80386, a much better solution is described below. EXTENDED MEMORY MANAGERS Built into every 80386 is a special capability that can be used to do an excellent job of providing EMS memory without the use of EMS hardware. This facility is called the paging unit or Memory Management Unit (MMU). The MMU consists of circuitry very much like the switching circuitry onboard EMS cards, except much more sophisticated. It was actually included for use by advanced operating systems but can be used quite nicely to emulate EMS in 80386-based DOS machines. The MMU, like the EMS emulators, can turn extended memory into expanded memory through software-only means. Unlike those emulators, the MMU, in conjunction with a piece of software known as an Extended Memory Manager (EMM), does not suffer any performance penalty. In fact, it is usually faster than true EMS cards because: the circuitry is onboard the CPU chip; the 80386 is faster than lower-class machines that usually use EMS cards; and the extended memory used is often fast, 32-bit system memory rather than card-based memory which is slowed down by the relatively slow I/O bus. On 80386 systems, this is definitely the way to go. Excellent EMMs include "386-to-the-Max" by Qualitas, Inc., and "QEMM-386" by Quarterdeck systems, Inc.. To use these EMMs, you need to install them in your CONFIG.SYS file. Like the EMS cards, you will have to configure them to partition your available system memory between extended and expanded memory. Consult the users manual for the package you are using. VIRTUAL MEMORY MANAGERS Virtual Memory Managers are another software-only approach to EMS. These function almost identically to the EMS emulators discussed above, except that they use the system disk rather than extended memory as the storage medium for blocks of memory copied out of your program. As you can imagine, this is excruciatingly s-l-o-w. Use this approach only as a last resort.