High memory area
Template:Short description Template:Distinguish Template:Use dmy dates Template:Use list-defined references
In DOS memory management, the high memory area (HMA) is the RAM area consisting of the first 65520 bytes above the one megabyte in an IBM AT or compatible computer.
In real mode, the segmentation architecture of the Intel 8086 and subsequent processors identifies memory locations with a 16-bit segment and a 16-bit offset, which is resolved into a physical address via (segment) × 16 + (offset). Although intended to address only 1 Megabyte (MB) (220 bytes) of memory, segment:offset addresses at FFFF:0010
and beyond reference memory beyond 1 MB (FFFF0 + 0010 = 100000
). So, on an 80286 and subsequent processors, this mode can actually address the first 65520 bytes of extended memory as part of the 64 KB range starting 16 bytes before the 1 MB mark—FFFF:0000 (0xFFFF0)
to FFFF:FFFF (0x10FFEF)
. The Intel 8086 and 8088 processors, with only 1 MB of memory and only 20 address lines, wrapped around at the 20th bit, so that address FFFF:0010
was equivalent to 0000:0000
.<ref name="Paul_2002_HMA"/>
To allow running existing DOS programs which relied on this feature to access low memory on their newer IBM PC AT computers, IBM added special circuitry on the motherboard to simulate the wrapping around. This circuit was a simple logic gate which could disconnect the microprocessor's 21st addressing line, A20, from the rest of the motherboard. This gate could be controlled, initially through the keyboard controller, to allow running programs which wanted to access the entire RAM.<ref name="Paul_2002_HMA"/>
So-called A20 handlers could control the addressing mode dynamically,<ref name="Paul_2002_HMA"/> thereby allowing programs to load themselves into the 1024–1088 KB region and run in real mode.<ref name="Paul_2002_HMA"/>
Code suitable to be executed in the HMA must either be coded to be position-independent (using only relative references),<ref name="Ingenoso_1998"/><ref name="Paul_2002_HMA"/> be compiled to work at the specific addresses in the HMA (typically allowing only one or at most two pieces of code to share the HMA), or it must be designed to be paragraph boundary or even offset relocatable (with all addresses being fixed up during load).<ref name="Ingenoso_1998"/><ref name="Paul_2002_HMA"/>
Before code (or data) in the HMA can be addressed by the CPU, the corresponding driver must ensure that the HMA is mapped in. This requires that any such requests are tunneled through a stub remaining in memory outside the HMA, which would invoke the A20 handler in order to (temporarily) enable the A20 gate.<ref name="Ingenoso_1998"/><ref name="Paul_2002_HMA"/> If the driver does not exhibit any public data structures and only uses interrupts or calls already controlled by the underlying operating system, it might be possible to register the driver with the system in a way so that the system will take care of A20 itself thereby eliminating the need for a separate stub.<ref name="Paul_2002_HMA"/><ref group="nb" name="NB_Backdoor"/>
The first user of the HMA among Microsoft products was Windows/286 2.1 in 1988, which introduced the HIMEM.SYS device driver. Starting in 1990 with Digital Research's DR DOS 5.0<ref name="Dryfoos_1991_DOS5"/> (via HIDOS.SYS /BDOS=FFFF<ref name="Novell_1994_DR6"/> and CONFIG.SYS HIDOS=ON) and since 1991 with MS-DOS 5.0<ref name="Dryfoos_1991_DOS5"/> (via DOS=HIGH), parts of the operating system's BIOS and kernel could be loaded into the HMA as well,<ref name="Dryfoos_1991_DOS5"/><ref name="Schulman_1994_Undocumented-DOS"/> freeing up to 46 KB of conventional memory.<ref name="Paul_2002_HMA"/> Other components, such as device drivers and terminate-and-stay-resident programs (TSRs), could at least be loaded into the upper memory area (UMA), but not into the HMA. Under DOS 5.0 and higher, with DOS=HIGH, the system additionally attempted to move the disk buffers into the HMA.<ref name="Schulman_1994_Undocumented-DOS"/> Under DR DOS 6.0 (1991) and higher, the disk buffers (via HIBUFFERS, and later also BUFFERSHIGH), parts of the command processor COMMAND.COM as well as several special self-relocating drivers like KEYB, NLSFUNC and SHARE could load into the HMA as well (using their /MH option), thereby freeing up even more conventional memory and upper memory for conventional DOS software to work with.<ref name="Paul_2002_HMA"/> TASKMAX seems to have relocated parts of itself into the HMA as well.<ref name="RBIL_2000_HMA"/><ref name="Paul_2002_MSDOS7"/> Novell's NLCACHE from NetWare Lite and early versions of NWCACHE from Personal NetWare and Novell DOS 7 could utilize the HMA as well.<ref name="Paul_1997_NWDOSTIP"/><ref name="Paul_2001_NWDOSTIP"/><ref name="Paul_2002_MSDOS7"/> Under MS-DOS/PC DOS, a ca. 2 KB shared portion of COMMAND.COM can be relocated into the HMA,<ref name="Chappell_1994_Internals"/> as well as DISPLAY.SYS bitmaps for prepared codepages.<ref name="Chappell_1994_Internals"/><ref name="Paul_2002_DISPLAY"/> Under MS-DOS 6.2 (1993) and higher, a ca. 5 KB portion of DBLSPACE.BIN/DRVSPACE.BIN can coexist with DOS in the HMA (unless DBLSPACE/DRVSPACE /NOHMA is invoked).<ref name="Schulman_1994_Undocumented-DOS"/><ref name="Cooper_2002_MS-DOS"/> Under PC DOS 7.0 (1995) and 2000, DOSKEY loads into the HMA (if available),<ref name="Brooks_2014_HMA"/> and SHARE can be loaded into the HMA as well (unless its /NOHMA option is given).<ref name="Brooks_2014_HMA"/> Under MS-DOS 7.0 (1995) to 8.0 (2000), parts of the HMA are also used as a scratchpad to hold a growing data structure recording various properties of the loaded real-mode drivers.<ref name="Paul_2002_MSDOS7"/><ref name="Sweger_2002"/><ref name="Paul_2002_HMA7"/>
See alsoEdit
- Low memory (the first 64 KB of memory)
- Extended memory (XMS)
- Expanded memory (EMS)
- Unreal mode
- Rebasing
- Paragraph boundary relocation
- Intra-segment offset relocation
- SHELLHIGH (CONFIG.SYS directive) SIZE=xxxx parameter to override default HMA pre-allocation (DR-DOS 7.02 and higher only)<ref name="Paul_1997_OD-A3"/>
- HMAREA (CONFIG.SYS directive) to specify the HMA segment (PTS-DOS only), similar to the DR DOS HIDOS.SYS /BDOS=xxxx parameter
- Incomplete address decoding
NotesEdit
ReferencesEdit
Further readingEdit
- {{#invoke:citation/CS1|citation
|CitationClass=web }}
- {{#invoke:citation/CS1|citation
|CitationClass=web }}
- {{#invoke:citation/CS1|citation
|CitationClass=web }}