Ворота в прошлое или проблема длиною в жизнь

07 Апр 2018

Ворота в прошлое или проблема длиною в жизнь

С недавних пор стало модным оснащать ноутбуки FreeDOS. Мотивация этого шага очевидна: переложить всю ответственность за выбор ОС на поль­зо­ва­те­ля. Мож­но ли запустить некогда ка­но­ни­че­скую опе­ра­ци­он­ную систему MS-DOS на новейшем но­ут­бу­ке ASUS X570UD с пред­ус­та­нов­лен­ной Windows 10? В силу спе­ци­фи­ки ряда исследовательских за­дач, да и просто ради экзотики, такой экс­пе­ри­мент был поставлен в тес­то­вой лаборатории «Компостер». И вот что из этого получилось.

Что-то с памятью моей стало

Уже на этапе выполнения директив, предписанных конфигурационным файлом config.sys мы столкнулись с си­ту­а­ци­ей, которую можно определить как неработоспособность himem.sys — драйвера расширенной («верхней») па­мя­ти. Напомним, он отвечает за программный доступ к области ОЗУ, расположенной в адресном пространстве за регионом Conventional Memory.

Драйвер расширенной памяти himem.sys не работает на исследуемой платформе ASUS X570UD

Как следствие, недоступна опция загрузки операционной системы в «верхнюю» память (dos=high), а значит, сво­бод­ный объем «нижней» памяти недостаточен для запуска ряда программ. Коррекция требований к объему Con­ven­tio­nal Memory, необходимой DOS-приложениям, не решает проблему: драйвер himem.sys, несмотря на сбой при загрузке, остается резидентным, а предоставляемые им для прикладных программ системные сервисы возвращают ошибки.

Утилита ICDiag 4.xx не запускается из-за некорректного состояния линии A20

Обнаруженная проблема напрямую связана с архитектурной особенностью семейства процессоров x86 — уп­рав­ле­ни­ем адресной линией A20. Заметим, что для использования DOS-среды на современных платформах при­ло­же­ния должны быть толерантны к включению A20 процедурами Legacy BIOS. Точнее, ситуация при которой линия A20 разрешена, а драйвер himem.sys отсутствует, не должна считаться ошибкой. Но чтобы разобраться в осо­бен­но­с­тях работы драйвера himem.sys на современных платформах потребуется экскурс в историю систем IBM PC/XT/AT. Let's go!

Линия A20 как родовое проклятие Intel

Все началось более тридцати лет назад с приходом в персональные платформы процессора Intel 80286 и, как след­ст­вие, расширением адресного пространства до 16 мегабайт в соответствии с возможностями 24-битной адресной шины. Небольшая несовместимость, на фоне сегодняшнего обилия проприетарных решений кажущаяся не­су­щест­вен­ной, затрагивала обработку арифметического переполнения, которое могло иметь место при суммировании сегмента и смещения в реальном режиме адресации.

Первенцы Intel x86 — процессоры 8086 и 8088, располагающие 20-битной адресной шиной, были рассчитаны на под­держ­ку пространства оперативной памяти, размером 1 мегабайт. Вместе с тем, формула вычисления фи­зи­че­ско­го адреса как суммы 16-битной базы сегмента, сдвинутой на 4 бита влево, и 16-битного смещения до­пус­ка­ет воз­мож­ность получения результата, разрядность которого превышает 20 бит. Например, если база сег­мен­та равна FFFFh, а смещение 0010h, должен быть сформирован адрес:

FFFF0h + 0010h = 100000h

Единица в двадцатом бите (если считать c нулевого) игнорировалась процессорами 8088/8086. В результате про­ис­хо­дил «заворот» на начало адресного пространства. Процессор 80286, адресная шина которого уже позволяла представить такое число, формировал правильную сумму сегмента и смещения, с выходом за пределы первого мегабайта.

Линия A20 как общественная нагрузка

На заре эры PC требования к программной совместимости были достаточно строгие, поэтому разработчики PC/AT 286 не могли проигнорировать различия в поведении CPU нового и старого поколений. Было принято решение мас­ки­ро­вать адресную линию A20, пропустив ее через логический элемент "И"(AND).

Для совместимости было принято решение маскировать адресную линию A20, пропустив ее через логический элемент "И"(AND)

С помощью такого вентиля линия A20 могла быть принудительно обнулена в целях совместимости с программным обеспечением, разработанным для процессоров 8088/8086. А для нового (по тем временам) софта, адресующего Extended Memory в защищенном режиме линию A20 требовалось включить.

Один из выходных сигналов контроллера клавиатуры 8042 используется для управления линией A20 (фрагмент документации Phoenix MultiKey)

Очевидно, для управления логическим вентилем требуется программно-доступный бит. Чтобы избежать до­бав­ле­ния еще одного регистра, разработчиками было принято решение использовать один из выходных портов конт­рол­ле­ра клавиатурного интерфейса 8042, установленного на системной плате. Таким образом, у этой микросхемы появилась еще одна «непрофильная обязанность». Полное перечисление таких обязанностей заслуживает от­дель­ной статьи.

Fast Gate A20 как конкурентное преимущество

Контроллер 8042 отрабатывает команды под управлением собственной программы. Это означает, что пе­ре­клю­че­ние состояния линии A20 с его участием выполняется сравнительно медленно. Особенно это сказывалось на ра­бо­те драйвера расширенной памяти himem.sys, одной из задач которого было копирование данных между «нижней» и «верхней» памятью без полного перехода в Protected Mode, а потому включать и выключать линию A20 тре­бо­ва­лось динамически.

Заменив программное решение на основе контроллера 8042 аппаратной «жесткой логикой», производитель плат­фор­мы получал конкурентное преимущество, причем относительно недорого, ведь фактически, требовалось до­бав­ле­ние одного регистра. Соблазн быстрого результата перевесил соображения унификации оборудования. Так свет увидели проприетарные решения, одно из которых Fast A20 Gate Port 92h.

В свою очередь, разработчикам драйвера himem.sys потребовалось реализовать fork-конструкцию: детектировать модель платформы и использовать раздельные процедуры управления линией A20, автоматически выбираемые в соответствии с программной моделью схемы управления.

Резюмируем

Что же получилось? В ходе решения проблемы, которую, по большому счету можно относительно безболезненно проигнорировать, отказавшись от эмуляции адресного переполнения, (что впоследствии и сделали разработчики AMI BIOS, передавая управление загрузчику ОС с включенной линией A20) было утеряно одно из ключевых пре­и­му­ществ PC-платформ того времени — полная унификация аппаратных решений.

Это обстоятельство существенно осложнило работу системных программистов, так как были созданы пред­по­сыл­ки для возникновения ошибок, проявление которых зависит от модели платформы. Закономерный вопрос, ко­то­рый могут задать покупатели ноутбука ASUS X570UD: куда бежать и что патчить?

Ноутбук ASUS X570UD с технологией высококачественного звука SonicMaster

Бежать стоит только на Facebook, чтобы рассказать, как причудлив мир персональных компьютеров. А патчить придется операционную систему Windows 10. Но, к счастью, об этом побеспокоится компания Microsoft и совсем не по поводу взбалмошной линии A20. Ее поведение никак не сказывается на ОС Windows 10: ведь главная угроза сегодня — вирусы и другое зловредное ПО.

Теги: