stringtranslate.com

Управление памятью DOS

Физические области памяти компьютеров семейства IBM PC

В IBM PC-совместимых вычислениях управление памятью DOS относится к программному обеспечению и методам, используемым для предоставления приложениям доступа к более чем 640 кибибайтам (640*1024 байт) (КиБ) «обычной памяти». Ограничение в 640 киБ было характерно для IBM PC и близких совместимых; другие машины, работающие под управлением MS-DOS, имели другие ограничения, например, Apricot PC мог иметь до 768 киБ, а Sirius Victor 9000 — 896 киБ. Управление памятью в семействе IBM было усложнено необходимостью поддержания обратной совместимости с исходным дизайном ПК [1] и DOS реального режима , позволяя при этом пользователям компьютеров использовать большие объемы недорогой памяти и новые поколения процессоров. Поскольку DOS уступила место Microsoft Windows и другим 32-разрядным операционным системам, не ограниченным исходным произвольным ограничением в 640 киБ IBM PC, управление памятью персонального компьютера больше не требует от пользователя ручного манипулирования внутренними настройками и параметрами системы.

Ограничение в 640 КБ значительно усложняло работу аппаратного и программного обеспечения, призванного его обойти; физическая память в машине могла быть организована как комбинация базовой или обычной памяти (включая нижнюю память), верхней памяти, верхней памяти (не то же самое, что верхняя память), расширенной памяти и расширенной памяти, причем все они обрабатывались по-разному.

Обычная память

Процессор Intel 8088, используемый в оригинальном IBM PC, имел 20 адресных линий и, таким образом, мог напрямую адресовать 1 МБ (2 20 байт) памяти. Различные области этого адресного пространства были выделены для различных видов памяти, используемой для разных целей. Начиная с самого нижнего конца адресного пространства, ПК имел установленную память с произвольным доступом (ОЗУ) для чтения/записи, которая использовалась DOS и прикладными программами. Первая часть этой памяти была установлена ​​на материнской плате системы (в самых ранних машинах 64 КБ, позже пересмотренная до 256 КБ). Дополнительная память могла быть добавлена ​​с помощью карт, вставленных в слоты расширения; каждая карта содержала перемычки или переключатели для управления тем, какая часть адресного пространства обращается к памяти и устройствам на этой карте.

На IBM PC все адресное пространство до 640 КБ было доступно для оперативной памяти. Эта часть адресного пространства называется «обычной памятью», поскольку она доступна всем версиям DOS автоматически при запуске. Сегмент 0, первые 64 КБ обычной памяти, также называется нижней областью памяти . Обычно память расширения устанавливается так, чтобы быть смежной в адресном пространстве с памятью на материнской плате. Если бы между памятью материнской платы и памятью расширения был нераспределенный промежуток, память не была бы автоматически определена как используемая DOS.

Верхняя область памяти

Верхняя область памяти (UMA) относится к адресному пространству между 640 и 1024 КБ (0xA0000–0xFFFFF). Область 128 КБ между 0xA0000 и 0xBFFFF была зарезервирована для памяти экрана VGA и устаревшего SMM. Область 128 КБ между 0xC0000 и 0xDFFFF была зарезервирована для дополнительных ПЗУ устройств , включая Video BIOS . 64 КБ адресного пространства от 0xE0000 до 0xEFFFF были зарезервированы для BIOS или дополнительных ПЗУ . IBM PC зарезервировал самые верхние 64 КБ адресного пространства от 0xF0000 до 0xFFFFF для BIOS и постоянной памяти (ПЗУ) Cassette BASIC . [2]

Например, область памяти монохромного видеоадаптера составляла от 704 до 736 КБ (0xB0000–0xB7FFF). Если бы использовался только монохромный видеоадаптер, адресное пространство между 0xA0000 и 0xAFFF могло бы использоваться для оперативной памяти, которая была бы смежной с обычной памятью. [3]

Системные BIOS ROM должны находиться в верхнем конце адресного пространства, поскольку начальный адрес ЦП фиксируется конструкцией процессора. Начальный адрес загружается в счетчик программ ЦП после аппаратного сброса и должен иметь определенное значение, которое сохраняется после прерывания питания системы. При сбросе или включении питания ЦП загружает адрес из системного ПЗУ, а затем переходит в определенное место ПЗУ, чтобы начать выполнение самотестирования при включении питания системы и в конечном итоге загрузить операционную систему.

Поскольку карта расширения, такая как видеоадаптер, контроллер жесткого диска или сетевой адаптер, может использовать распределение памяти во многих верхних областях памяти, настройка некоторых комбинаций карт требует внимательного чтения документации или экспериментирования, чтобы найти настройки карты и сопоставления памяти , которые работают. Сопоставление двух устройств для использования одних и тех же адресов физической памяти может привести к зависанию или нестабильной работе системы. [3] Не все адреса в верхней области памяти использовались в типичной системе; неиспользуемые физические адреса возвращали бы неопределенные и зависящие от системы данные, если бы к ним обращался процессор.

Расширенная память

По мере снижения цен на память прикладные программы, такие как электронные таблицы и автоматизированное черчение, были изменены, чтобы использовать все больше и больше физической памяти в системе. Виртуальная память в 8088 и 8086 не поддерживалась аппаратным обеспечением процессора, а дисковая технология того времени сделала бы ее слишком медленной и громоздкой, чтобы быть практичной. Расширенная память была системой, которая позволяла прикладным программам получать доступ к большему объему оперативной памяти, чем напрямую видно адресному пространству процессора. Процесс был формой переключения банков . Когда требовалась дополнительная оперативная память, программное обеспечение драйвера временно делало часть расширенной памяти доступной для процессора; когда данные в этой части памяти обновлялись, другая часть могла быть подгружена в адресное пространство процессора. Для IBM PC и IBM PC/XT , имеющих всего 20 адресных линий, были созданы специальные карты расширенной памяти, содержащие, возможно, мегабайт или более расширенной памяти, с логикой на плате, чтобы сделать эту память доступной для процессора в определенных частях адресного пространства 8088.

Выделение и использование расширенной памяти не было прозрачным для прикладных программ. Приложение должно было отслеживать, какой банк расширенной памяти содержал определенную часть данных, и когда требовался доступ к этим данным, приложение должно было запрашивать (через программу драйвера) плату расширенной памяти для отображения этой части памяти в адресное пространство процессора. Хотя приложения могли использовать расширенную память с относительной свободой, многие другие программные компоненты, такие как драйверы и программы terminate-and-stay-resident (TSR), по-прежнему обычно были ограничены областью «обычной памяти» 640 КБ, которая вскоре стала критически дефицитным ресурсом.

80286 и верхняя область памяти

Когда был представлен IBM PC/AT , архитектура сегментированной памяти процессоров семейства Intel имела побочный продукт, позволяя адресовать немного больше 1 МБ памяти в «реальном» режиме. Поскольку 80286 имел более 20 адресных линий, определенные комбинации сегмента и смещения могли указывать на память выше местоположения 0x0100000 (2 20 ). 80286 мог адресовать до 16 МБ системной памяти, тем самым устраняя поведение адресов памяти «зацикливанием». Поскольку теперь существовала требуемая адресная линия, комбинация F800:8000 больше не указывала бы на физический адрес 0x0000000, а на правильный адрес 0x00100000.

В результате некоторые программы DOS больше не работали. Для поддержания совместимости с поведением ПК и XT, AT включал шлюз линии A20 (Gate A20), который заставлял адреса памяти на AT переходить к нижней памяти, как это было бы на процессоре 8088. Этим шлюзом можно было управлять, изначально через контроллер клавиатуры , чтобы разрешить запуску программ, которые были разработаны для этого, получать доступ к дополнительным 65 520 байтам (64 КиБ) памяти в реальном режиме . Во время загрузки BIOS сначала включает A20 при подсчете и тестировании всей памяти системы и отключает его перед передачей управления операционной системе. Включение линии A20 является одним из первых шагов, которые операционная система x86 защищенного режима делает в процессе загрузки, часто до того, как управление будет передано ядру из начальной загрузки (например, в случае Linux).

Область верхней памяти ( HMA ) — это область ОЗУ , состоящая из первых 64 КБ, минус 16 байт , расширенной памяти на IBM PC/AT или совместимом микрокомпьютере.

Первоначально логический вентиль был вентилью, подключенным к контроллеру клавиатуры Intel 8042. Управление им было относительно медленным процессом. С тех пор были добавлены другие методы, позволяющие более эффективно выполнять многозадачность программ, которым требуется эта оборачиваемость с программами, которые обращаются ко всей памяти системы. Сначала существовало множество методов, но в конечном итоге отрасль остановилась на методе PS/2 с использованием бита в порту 92h для управления линией A20.

Отключение A20 не будет охватывать все обращения к памяти свыше 1 МБ, а только те, что находятся в диапазонах 1 МБ, 3 МБ, 5 МБ и т. д. Программное обеспечение реального режима заботится только об области чуть выше 1 МБ, поэтому Gate A20 было достаточно.

Виртуальный режим 8086 , представленный в Intel 80386 , позволяет имитировать циклический переход A20, используя возможности виртуальной памяти процессора: физическая память может быть сопоставлена ​​с несколькими виртуальными адресами, что позволяет памяти, сопоставленной в первом мегабайте виртуальной памяти, снова сопоставленной во втором мегабайте виртуальной памяти. Операционная система может перехватывать изменения в Gate A20 и вносить соответствующие изменения в адресное пространство виртуальной памяти, что также делает несущественной эффективность переключения Gate-A20.

Первым пользователем HMA среди продуктов Microsoft стала Windows 2.0 в 1987 году, которая представила драйвер устройства HIMEM.SYS . Начиная с версий 5.0 DR-DOS (1990) и MS-DOS (1991), части операционной системы также могли быть загружены в HMA, освобождая до 46 КиБ обычной памяти . Другие компоненты, такие как драйверы устройств и TSR, могли быть загружены в верхнюю область памяти (UMA).

В 80286 появилась дыра в памяти MMIO (от 15 до 16 МБ) для некоторых устройств ISA .

Обработчик A20

Обработчик A20 — это программное обеспечение, управляющее доступом к области верхней памяти. Обычно эту функциональность предоставляют менеджеры расширенной памяти . В DOS менеджеры области верхней памяти, такие как HIMEM.SYS, имели дополнительную задачу управления A20 и предоставляли API для открытия/закрытия A20. Сама DOS могла использовать эту область для некоторых своих нужд хранения, тем самым освобождая больше обычной памяти для программ. Эта функциональность была включена директивой " DOS =HIGH" в файле конфигурации CONFIG.SYS .

A20 gate на более поздних процессорах

Intel 80486 и Pentium добавили специальный вывод под названием A20M# , который при низком уровне устанавливает бит 20 физического адреса равным нулю для всех кэшей на кристалле или доступа к внешней памяти. Это было необходимо, поскольку 80486 ввел кэш на кристалле, и поэтому маскировка этого бита во внешней логике больше невозможна. Программное обеспечение по-прежнему должно манипулировать затвором и должно по-прежнему иметь дело с внешними периферийными устройствами ( чипсетом ) для этого. [4]

80386 и последующие процессоры

Процессоры Intel, начиная с 386- го, позволяли использовать виртуальный режим 8086 , что упрощало аппаратное обеспечение, необходимое для реализации расширенной памяти для приложений DOS. Менеджеры расширенной памяти, такие как продукт QEMM компании Quarterdeck и EMM386 компании Microsoft, поддерживали стандарт расширенной памяти без необходимости использования специальных плат памяти.

На процессорах 386 и последующих, менеджеры памяти, такие как QEMM, могли перемещать большую часть кода для драйвера или TSR в расширенную память и заменять его небольшим фрагментом, который мог получить доступ к резидентному коду расширенной памяти. Они могли анализировать использование памяти, чтобы обнаружить драйверы, которым требовалось больше оперативной памяти во время запуска, чем впоследствии, и восстанавливать и повторно использовать память, которая больше не нужна после запуска. Они могли даже переназначать области памяти, обычно используемые для отображенного в память ввода-вывода. Многие из этих трюков включали предположения о функционировании драйверов и других компонентов. По сути, менеджеры памяти могли на лету реконструировать и изменять код других поставщиков. Как и следовало ожидать, такие трюки не всегда работали. Поэтому менеджеры памяти также включали очень сложные системы настраиваемых параметров и положения для восстановления, если выбранный параметр делает ПК незагружаемым (что случается часто).

Установка и настройка менеджера памяти могли потребовать часов экспериментов с опциями, многократной перезагрузки машины и тестирования результатов. Но традиционная память была настолько ценной, что владельцы ПК считали, что это время было потрачено не зря, если в результате освобождалось 30 или 40 КБ пространства обычной памяти.

Расширенная память

В контексте IBM PC-совместимых компьютеров расширенная память относится к памяти в адресном пространстве процессоров 80286 и последующих, за пределами ограничения в 1 мегабайт, налагаемого 20 адресными линиями 8088 и 8086. Такая память недоступна напрямую для приложений DOS, работающих в так называемом «реальном режиме» процессоров 80286 и последующих. Эта память доступна только в защищенных или виртуальных режимах процессоров 80286 и более поздних.

Смотрите также

Ссылки

  1. ^ Мюллер, Скотт (1994). "7". Модернизация и ремонт ПК (4-е изд.). Que . ISBN 1-56529-932-9.
  2. ^ "Карта памяти (x86) - OSDev Wiki". wiki.osdev.org . Получено 20.12.2020 .
  3. ^ ab Mueller, Scott (1999). "6: Память". Модернизация и ремонт ПК (11-е изд.). Que Corporation . ISBN 0-7897-1903-7.
  4. ^ Шэнли, Том (1996). Архитектура программного обеспечения защищенного режима . Тейлор и Фрэнсис . стр. 60. ISBN 0-201-55447-X.

Внешние ссылки