PC Memory Management Overview DOS users are faced with a confusing array of memory configurations today. There's conventional memory, upper memory, expanded memory, extended memory, and the high memory area to name a few. Plus there are acronyms like UMB (Upper Memory Block), EMS (Expanded Memory Specification), XMS (eXtended Memory Specification), HMA (High Memory Area), VCPI (Virtual Control Program Interface) and DPMI (DOS Protected Mode Interface), which confuse matters even further. In this document, we'll try to explain the PC Memory Architecture, as well as popular memory management techniques and standards. The reason for all of these different types of memory has to do with the evolution of the Intel 80x86 family of microprocessors over the years. Since the 8086 and 8088 microprocessors, used in the original IBM PC and "XT-class" machines, we've seen tremendous growth in the speed and capabilities of PC microprocessors, yet limitations of the original 8086 design still hold us back. The primary limitation is the ability of the 8086 and 8088 processors to only address a 1MB range of memory...which seemed like a lot for their time, when 64KB was the extent of the addressing capability of competing non-Intel microprocessors. When IBM designed the original PC, they reserved the upper 384KB of this 1MB for the PC BIOS (Basic Input/Output System), video memory, and for adapter boards to install additional RAM, allowing applications to write directly to added RAM in order to communicate with the adapter. This left us with 640KB for DOS and application programs. The 80286 microprocessor supports a full 16MB address space, however this additional memory is only accessible when the 80286 operates in what is termed as its protected mode. The default mode of operation for the 80286 is real mode, which is 8086 compatible. In real mode, the 80286 is little more than a fast 8086. At the time that the 80286 was being designed by Intel, they had no idea that the PC and the 8086 would enjoy widespread popularity, and hence, the design of 80286 protected mode is very incompatible with real mode. Intel anticipated that since protected mode offered so many advantages over real mode, that real mode would just "go away". While there is a processor instruction to put the processor into protected mode, there is no way to return! Applications like non-dedicated NetWare 2.x, OS/2 v1.x and the various DOS extenders, have to play some real feats of magic in order to switch between real and protected modes. Mostly, the switch from protected mode back to real mode is done by performing a hard reset on the microprocessor (CTRL-ALT-DEL like). Before the processor is reset, a command is sent out to the keyboard controller. The response back from the keyboard controller is what wakes the processor back up from its reset, now in real mode. This is the reason why people often report sluggish keyboard problems with non-dedicated NetWare. Not all keyboard controllers are designed to support this operation. The 80386 added some exciting new features. In addition to supporting 8086 real mode and 80286 protected mode, the 80386 supports even more than 16MB, 4GB of physical memory, and 1TB of virtual memory. Thanks to a flat 32-bit address space, all physical memory is accessible in one flat address space (programmers are often hampered by 64KB at a time addressing limits on the 8086 and 80286). One of the real exciting enhancements of the 80386 is its virtual 8086 mode. Through the 80386's hardware features, it is able to emulate multiple 8086 microprocessors! This is how DesqView, Windows enhanced mode, and OS/2 v2 perform their magic multi- tasking DOS applications (with varying degrees of success). The 80386 also supports memory paging in its hardware. Applications only see a logical view of memory. When an application makes a memory request, the processor redirects the access to the actual physical location. The 80286 also provided a limited subset of memory paging support in protected mode only (on the 80286, paging is on a per 64KB segment basis, the 80386 pages on 4KB boundaries), but the 80386 makes this available in virtual 8086 mode as well, so that memory management products like QEMM, 386-to-the-MAX and MS-DOS 5/DR-DOS 6 EMM386 can perform memory management magic for DOS applications. Since we're talking about microprocessors for a background, I'll also mention the 80486. Effectively, the 80486 is a highly- tuned, highly-optimized 80386, which doesn't add many new capabilities, mostly just FASTER execution than past designs of this family. The 486 also includes an integrated math coprocessor (there is no need for an 80487) that really speeds up number crunching. The 486SX is essentially a crippled 486 without the built-in math coprocessor. For the sake of completeness, I'll also mention the 386SX. The 386SX is software compatible with the 80386, except that all external accesses that it makes to the outside world are made 16 bits at a time instead of 32 bits, which makes it a tad slower than a full blown 386 when it comes to accessing memory and devices. Similarly, the 8088 is an 8086 compatible processor, except that it makes its external accesses 8 bits at a time instead of 16 bits at a time. While this type of design makes the system a little slower, it allows for lower priced components to be used in building the system, making enhanced processor capabilities available in machines at lower price points. With a history of the Intel family of processors in mind, let's move on to the different types of memory. Conventional Memory is the memory range between 0 and 640KB, which is directly accessible to DOS applications. DOS and TSRs begin loading at the bottom area of memory and work their way up. Upper Memory (UMB for upper memory blocks) is memory between 640KB and 1MB. This memory begins at segment A000h, and is directly accessible from real mode, just "reserved" by the original PC design. Video buffers comprise the first 128KB of memory. The first 64KB (A000-AFFF) is typically used by EGA/VGA graphics modes. The next 32KB is the monochrome video text buffer (B000-B7FF), followed by 32KB for the color text video buffer (B800-BFFF). (The different buffer addresses were intended to allow color and monochrome systems both reside in the same system.) Other ranges of upper memory are used by other adapters (like network cards), and the PC's BIOS. The BIOS area is normally the top 64KB (F000-FFFF), although some systems use a 128KB BIOS (like PS/2s) (E000-FFFF). The left-over memory can be used for various purposes. On a 386 system, the 386 processor's paging techniques are used to map extended memory (memory beyond the 1MB limit, we'll get to it shortly) into the upper memory area, so that it can be addressed by the processor in real mode (or really virtual 8086 mode). On a 286 system, an expanded memory board can be installed, which installs physically addressable memory into this range of upper memory. Upper Memory blocks, or UMBs, are used for loading TSR programs "high", such as with the MS-DOS 5 LOADHIGH and DR-DOS 6 HILOAD commands. Memory managers for the 80386 can map memory into the upper memory area so that TSRs can be loaded outside of the standard 640KB. It is interesting to note that LOADHIGH and HILOAD load programs into upper memory, and not the actual area of memory known as the High Memory Area (HMA), which we will cover shortly. The memory manager remaps exTENded memory for use as upper memory. On a 286 or 8086 with exPANded memory hardware supporting the LIM EMS 4.0 specification, Quarterdeck's (the QEMM developers) QRAM product can convert exPANded memory into upper memory. ExPANded memory itself is actually addressed out of upper memory. In most implementations, 64KB of the upper memory area is set aside as the expanded memory page frame. Applications can then map in 64KB of expanded memory at a time, requesting different "pages" of expanded memory. (The LIM EMS 4.0 specification can get a little more flexible than this.) Usually, the expanded memory (EMS) page frame is located at segment D000h. ExTENded memory is memory that is not addressable by an 80x86 processor in real mode. It is memory above the 1MB boundary...accessible only from protected mode (or made accessible to other applications in virtual 8086 mode on a 386 through paging), which means it is only of real use to protected mode applications like those built with a DOS extender (Lotus Release 3.x), non-dedicated NetWare, OS/2, and others. A memory manager like QEMM or 386-to-the-MAX or MS-DOS 5/DR-DOS 6 EMM386 can convert extended memory into expanded memory and/or upper memory through 80836 memory paging techniques. Ironically, the VCPI (Virtual Control Program Interface) is used by memory managers and DOS Extenders to convert this exPANded memory back to exTENded memory, for programs like Lotus 3.x, which require exTENded memory instead of exPANded memory. Essentially, VCPI (supported by QEMM and 386-to-the-MAX, and available only on 80386 and above processors), is intended to give the application the type of memory that it wants...exPANded memory or exTENded memory. Rather than setting aside a pre- allocated amount of each type of memory, both exPANded and exTENded memory are allocated from the same pool. DPMI (DOS Protected Mode Interface), is similar to VCPI in concept, but different in implementation. DPMI, supported by Windows 3.x, updated versions of QEMM and 386-to-the-MAX, and several popular DOS extenders, is designed to allow applications running in protected mode access to DOS and BIOS services. As DOS is a real mode operating system, it requires extensions to allow protected mode applications access to DOS services. Real mode DOS applications can also access extended memory by transferring data in and out of extended memory (which involves toggling the processor between real and protected modes with a little help from the BIOS). These days, most applications that do this use the XMS specification. QEMM and 386-to-the-MAX provide this support, as does Microsoft HIMEM.SYS. The XMS specification is a specification to provide some sort of memory management over extended memory. There is a special area of exTENded memory, called the High Memory Area (HMA), which is the first 64KB of extended memory, which can be directly accessed from a DOS without the processor being in protected mode. The HMA is used by MS-DOS 5 when DOS=HIGH is specified in the CONFIG.SYS file to load part of DOS into the HMA, making more conventional memory available to applications. Similar support is provided in DR-DOS by HIDOS.SYS and/or the EMM386.SYS /B=FFFF command-line option and HIDOS=ON in the CONFIG.SYS. For versions of DOS prior to MS-DOS 5, Novell's XMSNETX shell also makes use of the XMS HMA to load part of the NetWare shell outside of conventional memory. With MS-DOS 5 or DR-DOS 6, it is typically better to let DOS use the HMA as it will give you better performance and more memory. Here's a memory chart to help you out... +------------------+ 16MB and beyond | | | EXTENDED | Addressable in protected mode, not real mode | MEMORY | | | |------------------| 1MB + 64KB (- 16 bytes if you're picky) | EXTENDED MEMORY | first 64KB of exTENded memory | HMA | used by MS-DOS DOS=HIGH or XMSNETX shell |------------------| 1MB | UPPER MEMORY | (LOADHIGH into unused blocks) | PC BIOS | (usually F000h-FFFFh, sometimes E000h-FFFFh) | Expanded Memory | (usually D000h-DFFFh) | Page Frame | | Network Cards | (Varies) | & other RAM/ROM | | Video Buffer | (A000h-BFFFh) |------------------| 640KB (segment A000h) | | | CONVENTIONAL | | MEMORY | | | | Applications | | | | TSRs | | DOS | | BIOS data area | +------------------+ 0KB (bottom of memory) Confused? Well...the PC memory architecture is confusing. In real terms, what all of this means is that 80386 memory management is your best bet, and why the 80286 and below machines are dead-end products for the future...they lack the extendibility and flexibility of the 386 architecture. 386 and 486 computers can turn exTENded memory into exPANded memory and Upper memory for applications that use those types of memory, and still support applications that use exTENded memory...making memory configuration issues far simpler. - Brett Warthen, Infinite Technologies (Last Revision: April 15, 1992)