В управлении памятью DOS область верхней памяти ( HMA ) — это область ОЗУ , состоящая из первых 65520 байтов сверх одного мегабайта в IBM AT или совместимом компьютере.
В реальном режиме архитектура сегментации процессоров Intel 8086 и последующих процессоров определяет ячейки памяти с помощью 16-битного сегмента и 16-битного смещения, которое преобразуется в физический адрес посредством (сегмент) × 16 + (смещение). Несмотря на то, что сегмент:смещение предназначено для адресации только 1 мегабайта (МБ) (2 20 байт) памяти, адресация сегмента:смещение находится в FFFF:0010
ссылочной памяти и за ее пределами, превышающей 1 МБ ( FFFF0 + 0010 = 100000
). Таким образом, на процессорах 80286 и последующих этот режим может фактически адресовать первые 65520 байт расширенной памяти как часть диапазона 64 КБ, начиная с 16 байт до отметки 1 МБ — FFFF:0000 (0xFFFF0)
до FFFF:FFFF (0x10FFEF)
. Процессоры Intel 8086 и 8088 имели всего 1 МБ памяти и всего 20 адресных строк , обернутых по 20-му биту, так что этот адрес FFFF:0010
был эквивалентен 0000:0000
. [1]
Чтобы разрешить запуск существующих программ DOS, которые использовали эту функцию для доступа к малой памяти на своих новых компьютерах IBM PC AT , IBM добавила на материнскую плату специальную схему для имитации переноса. Эта схема представляла собой простой логический элемент , который мог отключить 21-ю адресную линию микропроцессора, A20 , от остальной части материнской платы. Этими воротами можно было управлять, первоначально через контроллер клавиатуры , чтобы разрешить запуск программ, которым требовался доступ ко всей оперативной памяти. [1]
Так называемые обработчики A20 могли динамически управлять режимом адресации [1] , тем самым позволяя программам загружаться в область 1024–1088 КБ и работать в реальном режиме. [1]
Код, подходящий для выполнения в HMA, должен быть либо независим от позиции (с использованием только относительных ссылок), либо [2] [1] быть скомпилирован для работы по определенным адресам в HMA (обычно допуская только один или максимум два фрагменты кода для совместного использования HMA), или он должен быть спроектирован так, чтобы быть границей абзаца или даже перемещаемым со смещением (при этом все адреса фиксируются во время загрузки). [2] [1]
Прежде чем код (или данные) в HMA сможет быть адресован ЦП, соответствующий драйвер должен убедиться, что HMA отображается. Для этого необходимо, чтобы любые такие запросы туннелировались через заглушку, остающуюся в памяти вне HMA, которая вызывала бы Обработчик A20 для того, чтобы (временно) включить шлюз A20 . [2] [1] Если драйвер не имеет каких-либо общедоступных структур данных и использует только прерывания или вызовы, уже контролируемые базовой операционной системой, возможно, можно зарегистрировать драйвер в системе таким образом, чтобы система принимала уход за самим A20, тем самым устраняя необходимость в отдельной заглушке. [1] [номер 1]
Первым пользователем HMA среди продуктов Microsoft была Windows/286 2.1 в 1988 году, которая представила драйвер устройства HIMEM.SYS . Начиная с 1990 года с DR DOS 5.0 [3] компании Digital Research (через [4] и CONFIG.SYS ) и с 1991 года с MS-DOS 5.0 [3] (через ), можно было загружать части BIOS и ядра операционной системы. в HMA, [3] [5] освобождая до 46 КБ обычной памяти . [1] Другие компоненты, такие как драйверы устройств и резидентные программы завершения и пребывания (TSR), могут быть загружены как минимум в верхнюю область памяти (UMA), но не в HMA. В DOS 5.0 и выше система дополнительно пыталась переместить дисковые буферы в HMA. [5] В DR DOS 6.0 (1991) и выше дисковые буферы (через , а позже также ), части командного процессора COMMAND.COM , а также несколько специальных самоперемещающихся драйверов, таких как KEYB , NLSFUNC и SHARE, могли загружаться в HMA также (используя их опцию), тем самым освобождая еще больше обычной и верхней памяти для работы обычного программного обеспечения DOS. [1] TASKMAX, похоже, также перенес части себя в HMA. [6] [ 7] NLCACHE Novell из NetWare Lite и ранние версии NWCACHE из Personal NetWare и Novell DOS 7 также могут использовать HMA. [8] [9] [7] В MS-DOS/PC DOS ок. Общая часть COMMAND.COM размером 2 КБ может быть перемещена в HMA, [10] так же, как и растровые изображения DISPLAY.SYS для подготовленных кодовых страниц . [10] [11] В MS-DOS 6.2 (1993) и выше ок. Часть DBLSPACE.BIN / DRVSPACE.BIN размером 5 КБ может сосуществовать с DOS в HMA (если не вызывается DBLSPACE / DRVSPACE ). [5] [12] В ПК DOS 7.0 (1995) и 2000 DOSKEY загружается в HMA (если доступен), [13]HIDOS.SYS /BDOS=FFFF HIDOS=ONDOS=HIGHDOS=HIGHHIBUFFERSBUFFERSHIGH/MH /NOHMAи SHARE также можно загрузить в HMA (если не /NOHMAуказана эта опция). [13] В версиях MS-DOS от 7.0 (1995 г.) до 8.0 (2000 г.) части HMA также используются в качестве блокнота для хранения растущей структуры данных, записывающей различные свойства загруженных драйверов реального режима. [7] [14] [15]
[…] Одним из наиболее важных стимулов для добавления функций было конкурентное давление со стороны
DRDOS 5.0
, о котором мы впервые узнали весной 1990 года. Набор функций DRDOS побудил нас добавить поддержку
UMB
, замену задач и отмену удаления. […] Значительная часть внимания руководства команды была отвлечена на новые функции, такие как программное обеспечение для передачи файлов, восстановление удаления и сетевая установка […] В конце концов, в конце июля 1990 года эта ситуация достигла критической точки, и под руководством
БрэдСа
команда руководство провело серию напряженных встреч, чтобы определить график и процесс закрытия проекта […](1+32 страницы)
[…]
MS-DOS 7.0
+ добавляет INT 21h/AX=4A03h и INT 21h/AX=4A04h.
RBIL
61 INT 21h/AH=52h содержит некоторую информацию о цепочке MCB MS-DOS 7.0+ HMA […] Перемещение HMA для TSR имеет большой смысл для
DR-DOS
: хотя вы можете загружать большие части BIOS
и
BDOS
,
резидент часть оболочки,
BUFFERS
и DR-DOS TSR, такие как
SHARE
,
KEYB
и
NLSFUNC
(а в некоторых выпусках части TASKMGR и
NWCACHE
) в HMA, обычно все еще остается свободное пространство, обычно около 10 КБ (до около 20 КБ при использовании сторонней оболочки). Это также имеет смысл для
MS-DOS 5.0–6.22
и
PC
DOS
до
2000
, которые обычно оставляют 4–7 КБ памяти HMA неиспользуемыми (SHARE, KEYB и NLSFUNC не могут загружаться в HMA, но
DBLSPACE
и
HIMEM
могут в некоторых случаях загружаться в HMA
)
. степень). Доступное пространство HMA может быть довольно ограниченным в
MS-DOS 7.0+
, поскольку эта проблема представила новую и по большей части недокументированную структуру данных RMD, обычно расположенную в HMA. Ядро собирает и записывает данные конфигурации и драйвера реального режима во время загрузки (тип драйвера, прерывания, перехваченные драйвером,
строка вызова
CONFIG.SYS
и т. д.) и сохраняет эту информацию в […] сложном […] и […] растущая структура данных. Предположительно, эта информация предназначена для использования ядром Windows для получения лучшего представления о загруженных драйверах реального режима вместо того, чтобы рассматривать DOS как монолитный блок или даже […] пытаться отсоединить или выгрузить некоторые из них, однако это используется лишь в очень ограниченной степени (например, вы можете увидеть некоторую информацию, отраженную в файлах журналов, созданных при запуске Windows 9x, и некоторые части диспетчера конфигурации Windows также используют ее), оставляя место для спекуляций, выходящих далеко за рамки техническая сторона – в частности потому, что ничего интересного не задокументировано… […]
NWDOSTIP.TXT
Это обширная работа по Novell DOS 7 и OpenDOS 7.01 , включая описание многих недокументированных функций и внутренних устройств. Это часть еще более обширной коллекции автора, MPDOSTIP.ZIP
которая поддерживалась до 2001 года и в то время распространялась на многих сайтах. Предоставленная ссылка указывает на более старую версию файла, преобразованную в HTML.) [4][…] некоторые выпуски DISPLAY.SYS (
например, PC DOS 7/2000) сохраняют неиспользуемые в данный момент
шрифты
в
памяти
XMS
. Некоторые более ранние выпуски MS-DOS/PC DOS DISPLAY.SYS, похоже, имели возможность хранить их в HMA […]
[…]
DOSKEY.COM
[…] Переместите код в HMA, если он доступен. […]
SHARE.EXE
[…] Переместите код в HMA, если он доступен, и добавлен параметр /NOHMA для принудительной низкой загрузки. […]
[…] Код ANSIPLUS не может быть загружен в HMA под
MS-DOS 7
(только для Windows 9x), поскольку, очевидно, недостаточно неиспользуемой памяти HMA. […]
[…] 86-DOS , а следовательно, и PC DOS / MS-DOS , использовали хитрый трюк. Байт по смещению 5 PSP содержал код операции дальнего вызова (9Ah); слово по смещению 6 PSP содержало соответствующее значение, указывающее размер сегмента программы, а также часть смещения дальнего вызова. Слово со смещением 8, которое служило частью сегмента дальнего вызова, было создано таким образом, что в сочетании со смещением оно оборачивалось (хорошо понятная особенность ЦП 8086 ) и указывало на адрес 0:C0h, который содержит вектор прерывания 30h. […] Интерфейс CALL 5 работает даже в эмуляции DOS под Windows NT и OS/2, и эти системы наверняка не смогут работать с отключенной линией A20 . Как это тогда работает? […] Вместо того, чтобы отсекать биты адреса, система зеркально отображает пять байтов по адресу 0:C0h и 1000C0h. Тот же метод фактически использовался в DOS 5 и выше, работавших с DOS=HIGH. В этом случае DOS гарантирует, что линейный адрес 1000C0h содержит соответствующий дальний вызов. […]
[…] в случае таких искаженных указателей […] много лет назад мы с Акселем думали о том, как использовать *одну* точку входа в драйвер для нескольких векторов прерываний (поскольку это сэкономило бы нам много места для несколько точек входа и более или менее идентичный код кадрирования запуска/выхода во всех них), а затем внутренне переключиться на разные обработчики прерываний. Например: 1234h:0000h […] 1233h:0010h […] 1232h:0020h […] 1231h:0030h […] 1230h:0040h […] все указывают на одну и ту же точку входа. Если вы подключите INT 21h к 1234h:0000h и INT 2Fh к 1233h:0010h и т. д., все они пройдут через одну и ту же «лазейку», но вы все равно сможете различать их и внутренне разветвляться на разные обработчики. Подумайте о «сжатой» точке входа в заглушку A20 для загрузки HMA. Это работает до тех пор, пока ни одна программа не начнет выполнять магию сегмента: смещения. […] Сравните это с противоположным подходом, заключающимся в наличии нескольких точек входа (возможно, даже с поддержкой протокола совместного использования прерываний IBM ) , который потребляет гораздо больше памяти, если вы перехватываете много прерываний. […] Мы пришли к выводу, что на практике это, скорее всего, не сохранится, потому что никогда не знаешь, нормализуют или денормализуют указатели другие драйверы и по каким причинам. […]