Большая область памяти
В управлении памятью 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 года с Digital Research. компании DR DOS 5.0 [3] (с помощью HIDOS.SYS /BDOS=FFFF[4] и CONFIG.SYS HIDOS=ON) и с 1991 года с MS-DOS 5.0. [3] (с помощью DOS=HIGH и ядра операционной системы ), части BIOS также могут быть загружены в HMA, [3] [5] освобождение до 46 КБ обычной памяти . [1] Другие компоненты, такие как драйверы устройств и резидентные программы завершения и пребывания (TSR), могут быть загружены как минимум в верхнюю область памяти (UMA), но не в HMA. Под DOS 5.0 и выше, с DOS=HIGH, система дополнительно попыталась переместить дисковые буферы в HMA. [5] В DR DOS 6.0 (1991) и выше дисковые буферы (через HIBUFFERS, а позже также BUFFERSHIGH), части командного процессора COMMAND.COM, а также несколько специальных самоперемещающихся драйверов, таких как KEYB , NLSFUNC и SHARE, также могут загружаться в HMA (используя их /MH вариант), тем самым освобождая еще больше обычной памяти и верхней памяти для работы обычного программного обеспечения DOS. [1] TASKMAX , похоже, также перенес части себя в HMA. [6] [7] Novell от NLCACHE из 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.BIN не /NOHMA вызывается). [5] [12] В ПК DOS 7.0 1995) и 2000 DOSKEY ( загружается в HMA (если доступен), [13] и SHARE также можно загрузить в HMA (если только он не /NOHMA предоставлен вариант). [13] В версиях MS-DOS от 7.0 (1995 г.) до 8.0 (2000 г.) части HMA также используются в качестве блокнота для хранения растущей структуры данных, записывающей различные свойства загруженных драйверов реального режима. [7] [14] [15]
См. также
[ редактировать ]- Недостаточная память (первые 64 КБ памяти)
- Расширенная память (XMS)
- Расширенная память (EMS)
- Нереальный режим
- Перебазирование
- Перемещение границы абзаца
- Перемещение смещения внутри сегмента
- SHELLHIGH (директива CONFIG.SYS) Параметр SIZE=xxxx для переопределения предварительного выделения HMA по умолчанию (только DR-DOS 7.02 и выше) [16]
- HMAREA (директива CONFIG.SYS) для указания сегмента HMA (только PTS-DOS), аналогично параметру DR DOS HIDOS.SYS /BDOS=xxxx.
- Неполная расшифровка адреса
Примечания
[ редактировать ]- ^ Заглушка не требуется для резидентных системных расширений SHARE и NLSFUNC в DR DOS 6.0 и выше, поскольку они перехватывают только мультиплексное прерывание INT 2Fh и, следовательно, могут использовать интерфейс бэкдора для подключения к цепочке прерываний в пространстве ядра , чтобы Gate Обработчик A20 обеспечит функциональность заглушки.
Ссылки
[ редактировать ]- ^ Jump up to: а б с д и ж г час я дж Пол, Матиас Р. (2 февраля 2002 г.). «Treiber dynamisch nachladen (Intra-Segment-Offset-Relokation zum Laden von TSRs in die HMA)» [Динамическая загрузка драйверов (перемещение внутрисегментного смещения для загрузки TSR в HMA)] (на немецком языке). Группа новостей : de.comp.os.msdos . Архивировано из оригинала 9 сентября 2017 г. Проверено 2 июля 2017 г. (Примечание. Дается всесторонний обзор истории и «природы» HMA, а также неочевидных конструктивных ограничений, которые следует учитывать при разработке расширений резидентной системы для загрузки в HMA. Также описывается, как решить эти проблемы с помощью заглушек , бэкдоры и перемещение смещения внутри сегмента - метод, используемый драйверами DR-DOS, способными перемещаться в HMA, и аналогичный (более сложному) методу, используемому в качестве основы для динамического устранения мертвого кода в авторском драйвере FreeKEYB.)
- ^ Jump up to: а б с Ингеносо, Тони (20 декабря 1998 г.). «Глава 13. Ворота А20 и HMA». Улучшение работы кода — Как минимизировать размер кода 80x86 и иногда сделать его быстрее (электронная книга). Архивировано из оригинала 18 ноября 2019 г. Проверено 18 ноября 2019 г.
- ^ Jump up to: а б с Драйфус, Майк, изд. (18 сентября 1991 г.) [19 июля 1991 г.]. «Отчет о разработке MS-DOS 5.0» (PDF) (почта как судебный документ). Майкрософт . п. 10. MS-PCA1179169 (MS-PCA1179159-MS-PCA1179191). MS7020988 (MS7020978-MS7021010). Депо. Бывший. 1109. Прилагается к Microsoft Доказательство истца 3473. CA.No.2:96CV645B Доказательство истца 477. Архивировано (PDF) из оригинала 02 апреля 2019 г. Проверено 22 июля 2019 г.
[…] Одним из наиболее важных стимулов для добавления функций было конкурентное давление со стороны DRDOS 5.0 , о котором мы впервые узнали весной 1990 года. Набор функций DRDOS побудил нас добавить поддержку UMB , замену задач и отмену удаления. […] Значительная часть внимания руководства команды была отвлечена на новые функции, такие как программное обеспечение для передачи файлов, восстановление удаления и сетевая установка […] В конечном итоге эта ситуация достигла критической точки в конце июля 1990 года, и под руководством БрэдСа команда руководство провело серию напряженных встреч, чтобы определить график и процесс закрытия проекта […]
(1+32 страницы) - ^ Банта, К.; Партридж, Д. (18 августа 1994 г.). «Сторонние менеджеры памяти» . DR DOS 6.0 (Документ технической информации). Редакция А. Novell . TID800074 (заменяет FYI-M-1303). Архивировано из оригинала 15 декабря 2021 г. Проверено 15 декабря 2021 г.
- ^ Jump up to: а б с Шульман, Эндрю; Браун, Ральф Д .; Макси, Дэвид; Михелс, Раймонд Дж.; Кайл, Джим (1994) [ноябрь 1993 г.]. Уильямс, Эндрю (ред.). Недокументированная DOS: Руководство программиста по зарезервированным функциям и структурам данных MS-DOS, расширенное за счет включения MS-DOS 6, Novell DOS и Windows 3.1 . Серия программ Эндрю Шульмана (1-е издание, 2-е изд.). Ридинг, Массачусетс, США: Издательство Addison Wesley Publishing Company . стр. 42, 349–350, 437–438. ISBN 0-201-63287-Х . ISBN 978-0-201-63287-3 . (xviii+856+vi страниц, 3,5-дюймовая дискета [1] : ) Ошибки
- ^ «Формат блока памяти HMA (ядро DR DOS 6.0, загруженное в HMA)» . РБИЛ . 2000. Архивировано из оригинала 18 февраля 2020 г. Проверено 18 февраля 2020 г.
- ^ Jump up to: а б с Пол, Матиас Р. (10 апреля 2002 г.). «[fd-dev] Доступ к HMA из TSR» . freedos-dev . Архивировано из оригинала 9 сентября 2017 г. Проверено 9 сентября 2017 г.
[…] 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 DBLSPACE и PC DOS до 2000 , которые обычно оставляют 4–7 КБ памяти HMA неиспользуемыми (SHARE, KEYB и NLSFUNC не могут загружаться в HMA, но и HIMEM могут в некоторых случаях загружаться в HMA). степень). Доступное пространство HMA может быть довольно ограниченным в MS-DOS 7.0+ , поскольку эта проблема представила новую и по большей части недокументированную структуру данных RMD, обычно расположенную в HMA. Ядро собирает и записывает данные конфигурации и драйвера реального режима во время загрузки (тип драйвера, прерывания, перехваченные драйвером, CONFIG.SYS и т. д.) и сохраняет эту информацию в […] сложной […] и […] растущей структуре данных. Предположительно, эта информация предназначена для использования ядром Windows для получения лучшего представления о загруженных драйверах реального режима вместо того, чтобы рассматривать DOS как монолитный блок или даже […] пытаться отсоединить или выгрузить некоторые из них, однако это используется только в очень ограниченной степени (например, вы можете увидеть некоторую информацию, отраженную в файлах журналов, созданных при запуске Windows 9x, и некоторые части диспетчера конфигурации Windows также используют ее), оставляя место для спекуляций, выходящих далеко за рамки техническая сторона – в частности потому, что ничего интересного не задокументировано… […]
- ^ Пол, Матиас Р. (30 июля 1997 г.) [1 мая 1994 г.]. «II.4. Недокументированные свойства внешних команд». NWDOS-TIPs — Советы и рекомендации по Novell DOS 7 с учетом недокументированных подробностей, ошибок и обходных путей . MPDOSTIP (на немецком языке) (3-е изд.). Архивировано из оригинала 5 ноября 2016 г. Проверено 11 января 2012 г. (Примечание.
NWDOSTIP.TXT
представляет собой исчерпывающую работу по Novell DOS 7 и OpenDOS 7.01 , включая описание многих недокументированных функций и внутренних устройств. Это часть еще более обширной работы автора.MPDOSTIP.ZIP
Коллекция сохранялась до 2001 года и в то время распространялась на многих сайтах. Предоставленная ссылка указывает на более старую версию файла, преобразованную в HTML.) [4] - ^ Пол, Матиас Р. (9 апреля 2001 г.). «II.4. Недокументированные свойства внешних команд». NWDOS-TIPs — Советы и рекомендации по Novell DOS 7 с учетом недокументированных подробностей, ошибок и обходных путей . MPDOSTIP (на немецком языке) (3-е изд.).
- ^ Jump up to: а б Чаппелл, Джефф (январь 1994 г.). Шульман, Эндрю; Педерсен, Аморетт (ред.). Внутреннее устройство DOS . Серия программ Эндрю Шульмана (1-е издание, 1-е изд.). Издательская компания Аддисон Уэсли . стр. 4, 21, 100–106, 127–129. ISBN 978-0-201-60835-9 . ISBN 0-201-60835-9 . (xxvi+738+iv страниц, 3,5-дюймовая дискета [5] [6] ) Исправления: [7] [8] [9]
- ^ Пол, Матиас Р. (4 декабря 2002 г.). "[fd-dev] DISPLAY CON?" . freedos-dev . Архивировано из оригинала 8 декабря 2021 г.
[…] некоторые выпуски DISPLAY.SYS ( DOS 7/2000 PC например, ) сохраняют неиспользуемые в данный момент шрифты в памяти XMS . Некоторые более ранние выпуски MS-DOS/PC DOS DISPLAY.SYS , похоже, имели возможность хранить их в HMA […]
- ^ Купер, Джим (2002). Использование MS-DOS 6.22 (специальное 3-е изд.). Издательство Que . п. 669. ИСБН 0-78972573-8 . ISBN 978-0-78972573-8 . Архивировано из оригинала 18 февраля 2020 г. Проверено 18 февраля 2020 г.
- ^ Jump up to: а б Брукс, Вернон К. (2014). «Это подробный список изменений, которые я сделал в PC DOS 7.0» . ПК DOS Ретро . Архивировано из оригинала 18 февраля 2020 г. Проверено 18 февраля 2020 г.
[…] DOSKEY.COM […] Переместите код в HMA, если он доступен. […] SHARE.EXE […] Переместите код в HMA, если он доступен, и добавлен параметр /NOHMA для принудительной низкой загрузки. […]
- ^ Свегер, Кристофер (2007) [15 июля 2002 г.]. «АНСИПЛЮС и Windows» . Архивировано из оригинала 28 ноября 2021 г. Проверено 28 ноября 2021 г.
[…] Код ANSIPLUS не может быть загружен в HMA под MS-DOS 7 (только для Windows 9x), поскольку, очевидно, недостаточно неиспользуемой памяти HMA. […]
- ^ Пол, Матиас Р. (13 августа 2002 г.). «Найдите свободную память объемом менее 1 МБ, которая не будет перезаписана ОС» (на немецком языке). Группа новостей : de.comp.lang.assembler.x86 . Архивировано из оригинала 4 сентября 2017 г. Проверено 3 сентября 2017 г.
- ^ Пол, Матиас Р. (02 октября 1997 г.) [29 сентября 1997 г.]. «Caldera OpenDOS 7.01/7.02 Update Alpha 3 IBMBIO.COM — README.TXT и BOOT.TXT — краткое описание загрузки OpenDOS» . Архивировано из оригинала 4 октября 2003 г. Проверено 29 марта 2009 г. [10]
Дальнейшее чтение
[ редактировать ]- Некасек, Михал (13 сентября 2011 г.). «Да вообще, кому нужен перенос адресов?» . Музей OS/2 . Архивировано из оригинала 19 февраля 2020 г. Проверено 19 февраля 2020 г.
[…] 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 содержит соответствующий дальний вызов. […]
- Козерок, Чарльз М. (17 апреля 2001 г.) [1997]. «Область высокой памяти (HMA)» . Руководство для ПК . 2.2.0. Архивировано из оригинала 16 октября 2006 г. Проверено 15 октября 2006 г.
- Пол, Матиас Р. (11 апреля 2002 г.). «Re: [fd-dev] АНОНС: CuteMouse 2.0 альфа 1» . freedos-dev . Архивировано из оригинала 21 февраля 2020 г. Проверено 21 февраля 2020 г.
[…] в случае таких искаженных указателей […] много лет назад мы с Акселем думали о том, как использовать *одну* точку входа в драйвер для нескольких векторов прерываний (поскольку это сэкономило бы нам много места для несколько точек входа и более или менее идентичный код кадрирования запуска/выхода во всех них), а затем внутренне переключиться на разные обработчики прерываний. Например: 1234h:0000h […] 1233h:0010h […] 1232h:0020h […] 1231h:0030h […] 1230h:0040h […] все указывают на одну и ту же точку входа. Если вы подключите INT 21h к 1234h:0000h и INT 2Fh к 1233h:0010h и т. д., все они пройдут через одну и ту же «лазейку», но вы все равно сможете различать их и внутренне разветвляться на разные обработчики. Подумайте о «сжатой» точке входа в заглушку A20 для загрузки HMA. Это работает до тех пор, пока ни одна программа не начнет выполнять магию сегмента: смещения. […] Сравните это с противоположным подходом, заключающимся в наличии нескольких точек входа (возможно, даже поддерживающих IBM Interrupt Sharing Protocol ), который потребляет гораздо больше памяти, если вы перехватываете много прерываний. […] Мы пришли к выводу, что на практике это, скорее всего, не сохранится, потому что никогда не знаешь, нормализуют или денормализуют указатели другие драйверы и по каким причинам. […]