Линия А20

Сигнал в системной шине компьютерной системы на базе x86

Область верхней памяти доступна в реальном режиме только на процессорах 80286, если включен вентиль A20.

A20 , или адресная линия 20 , является одной из электрических линий, составляющих системную шину компьютерной системы на базе x86 . Линия A20 в частности используется для передачи 21-го бита на адресной шине .

Микропроцессор обычно имеет число адресных линий, равное логарифму по основанию два числа слов в его физическом адресном пространстве . Например, процессор с 4 ГБ адресуемого побайтно физического пространства требует 32 линии (log 2 (4 ГБ) = log 2 (2 32 B) = 32), которые называются от A0 до A31. Линии названы в соответствии с нулем, начиная с номера бита в адресе, который они передают. Наименее значимый бит является первым и, следовательно, имеет номер бита 0 и сигнализируется на линии A0. A20 передает бит 20 (21-й бит) и становится активным, как только адрес достигает 1 МБ, или 2 20 .

Обзор

Процессоры Intel 8086 , Intel 8088 и Intel 80186 имели 20 адресных линий, пронумерованных от A0 до A19; с их помощью процессор мог получить доступ к 2 20 байтам или 1 МБ. Внутренние адресные регистры таких процессоров имели только 16 бит. Для доступа к 20-битному адресному пространству ссылка на внешнюю память составлялась из 16-битного адреса смещения , добавленного к 16-битному номеру сегмента , сдвинутому на 4 бита влево, чтобы получить 20-битный физический адрес. Результирующий адрес равен сегменту  × 16 + смещение . [1] Существует много комбинаций сегмента и смещения, которые дают один и тот же 20-битный физический адрес. Поэтому существовали различные способы адресации одного и того же байта в памяти. [2] Например, вот четыре из 4096 различных комбинаций сегмент:смещение, все из которых ссылаются на байт, физический адрес которого равен 0x000FFFFF (последний байт в пространстве памяти размером 1 МБ):

Ф000:ФФФФ
ФФФФ:000Ф
F555:AAAF
Ф800:7ФФФ

В последнем случае увеличение смещения на единицу дает F800:8000 , что является правильным адресом для процессора, но поскольку он преобразуется в физический адрес 0x00100000 (первый байт свыше 1 МБ), процессору понадобится еще одна адресная строка для фактического доступа к этому байту. Поскольку такой строки нет на линейке процессоров 8086, 21-й бит выше, хотя и установлен, отбрасывается, в результате чего адрес F800:8000 «переворачивается» [1] и фактически указывает на физический адрес 0x00000000 .

Когда IBM проектировала машину IBM PC AT (1984), она решила использовать новый более производительный микропроцессор Intel 80286. 80286 мог адресовать до 16 МБ системной памяти в защищенном режиме . Однако ЦП должен был эмулировать поведение 8086 в реальном режиме , его режиме запуска, чтобы он мог запускать операционные системы и программы, которые не были написаны для защищенного режима. Однако 80286 не принудительно сбрасывал линию A20 в ноль в реальном режиме. Поэтому комбинация F800:8000 больше не указывала бы на физический адрес 0x00000000 , а на адрес 0x00100000 . В результате программы, полагающиеся на циклический адрес, больше не работали. Чтобы оставаться совместимыми с такими программами, IBM решила исправить проблему на материнской плате .

Это было достигнуто путем вставки логического вентиля на линии A20 между процессором и системной шиной, который получил название Gate-A20 . Gate-A20 может быть включен или отключен программным обеспечением, чтобы разрешить или запретить адресной шине получать сигнал от A20. Он установлен в состояние непрохождения для выполнения старых программ, которые полагаются на циклический переход. Во время загрузки BIOS сначала включает Gate-A20, когда он подсчитывает и тестирует всю системную память, а затем отключает его перед передачей управления операционной системе.

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

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

Включение линии Gate-A20 является одним из первых шагов, которые операционная система x86 защищенного режима выполняет в процессе загрузки, часто до того, как управление будет передано ядру от загрузчика ( например, в случае Linux ).

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

ворота А20

Управление линией A20 было важной функцией на определенном этапе развития архитектуры IBM PC, поскольку оно обеспечивало доступ к дополнительным 65 520 байтам (64 КБ − 16 байт) памяти в реальном режиме без существенных изменений программного обеспечения.

В том, что можно считать «хаком», вентиль A20 изначально был частью контроллера клавиатуры на материнской плате, который мог открывать или закрывать его в зависимости от желаемого поведения. [4]

Для сохранения полной совместимости с Intel 8086 , шлюз A20 присутствовал в процессорах Intel до 2008 года. [5] Поскольку шлюз изначально закрывался сразу после загрузки, операционные системы защищенного режима обычно открывали шлюз A20 на ранней стадии процесса загрузки, чтобы никогда больше его не закрывать. У таких операционных систем не было причин совместимости держать его закрытым, и они получали доступ ко всему диапазону доступных физических адресов, открыв его.

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

Руководство по проектированию систем ПК PC 2001 устраняет совместимость для линии A20: «Если в системе все еще присутствует логика генерации A20M#, эта логика должна быть прекращена таким образом, чтобы программные записи в порт ввода-вывода 92, бит 1, не приводили к утверждению A20M# на процессоре». [7]

Поддержка затвора A20 была изменена в микроархитектуре Nehalem (некоторые источники ошибочно утверждают, что поддержка A20 была удалена). Вместо того, чтобы ЦП имел выделенный вывод A20M#, который получает сигнал о том, маскировать бит A20 или нет, он был виртуализирован таким образом, что информация отправляется с периферийного оборудования на ЦП с использованием специальных циклов шины. [ необходима цитата ] С точки зрения программного обеспечения механизм работает точно так же, как и раньше, и операционная система по-прежнему должна программировать внешнее оборудование (которое, в свою очередь, отправляет вышеупомянутые циклы шины на ЦП) для отключения маскировки A20. [ необходима цитата ]

Intel больше не поддерживает шлюз A20, начиная с Haswell . На странице 271 Руководства системного программиста Intel, том 3A, от июня 2013 г. указано: «Функциональность A20M# используется в основном старыми операционными системами и не используется современными операционными системами. На новых процессорах Intel 64 A20M# может отсутствовать». [8]

Обработчик A20

Обработчик A20 — это программное обеспечение менеджера памяти IBM PC , которое управляет доступом к области верхней памяти (HMA). Менеджеры расширенной памяти обычно предоставляют эту функциональность. Обработчики A20 названы в честь 21-й адресной линии микропроцессора, линии A20.

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

Затронутые программы

С 1980 года перенос адреса использовался внутри 86-DOS и MS-DOS для реализации точки входа DOS CALL 5 со смещением от +5 до +9 (что эмулирует точку входа API CALL 5 BDOS в стиле CP/M-80 со смещением от +5 до +7) в префиксе сегмента программы (PSP) (который частично напоминает нулевую страницу CP/M-80 ). [9] [10] Это, в частности, использовалось программами, машинно переведенными с CP/M-80 с помощью трансляторов языка ассемблера [9], таких как TRANS86 компании Seattle Computer Products . [11] Обработчик CALL 5, на который ссылается эта точка входа, находится по физическому адресу машины 0x000000C0 (тем самым перекрывая четыре байта точки входа процедуры обслуживания прерываний , зарезервированной для INT 30h, и первый байт INT 31h в таблице векторов прерываний реального режима x86 ). [12] [13] [14] Однако, в силу конструкции CP/M-80, которая загружала операционную систему непосредственно над памятью, доступной для запуска прикладной программы, 16-битный целевой адрес 8080 / Z80, хранящийся по смещению от +6 до +7 на нулевой странице, мог также намеренно интерпретироваться как размер первого сегмента памяти. [9] Для того чтобы эмулировать это в DOS с его схемой адресации сегмент: смещение 8086, 16-битное смещение дальней точки входа вызова должно было соответствовать этому размеру сегмента (т. е. 0xFEF0 ), который хранится по смещению от +6 до +7 в PSP, перекрывая части CALL 5. [13] [14] Единственным способом согласовать эти требования было выбрать значение сегмента, которое при добавлении к 0xFEF0 даст адрес 0x001000C0 , который на 8086 преобразуется в 0x000000C0 . [15] [12] [14]

A20 должен был быть отключен для того, чтобы произошел циклический переход и программы DOS, использующие этот интерфейс, работали. Более новые версии DOS, которые могут перемещать части себя в HMA, обычно создают копию точки входа в FFFF:00D0 в HMA (которая снова разрешается в физический 0x001000C0 ), так что интерфейс может работать независимо от состояния A20. [14] [16]

Одной из известных программ, использующих интерфейс CALL 5, является DOS-версия компилятора Small-C . [17] Кроме того, утилита SPELL в Microsoft Word 3.0 (1987) является одной из программ, зависящих от интерфейса CALL 5, который должен быть настроен соответствующим образом. [18] PC-NFS (1993) от Sun Microsystems также требует исправления CALL 5. [16]

Кроме того, для экономии места в программе [1] некоторые программисты BIOS и DOS использовали трюк , например, чтобы иметь один сегмент, который имеет доступ к данным программы (например, от F800:0000 до F800:7FFF , указывающим на физические адреса 0x000F8000–0x000FFFFF ), а также к данным ввода-вывода (например, буфер клавиатуры), который был расположен в первом сегменте памяти (с адресами от F800:8000 до F800:FFFF, указывающими на физические адреса от 0x00000000 до 0x00007FFF ).

Этот трюк работает до тех пор, пока код не выполняется в нижней части памяти , первых 64 КБ ОЗУ, что всегда было верно в старых версиях DOS без возможности высокой загрузки.

С перемещением ядра DOS в области с большей памятью для программ все больше становился доступен низкий объем памяти, что приводило к сбою тех, которые зависели от обертывания. [19] Исполняемые загрузчики в новых версиях DOS пытаются обнаружить некоторые распространенные типы затронутых программ и либо исправить их на лету, чтобы они также работали в условиях низкой памяти [20] , либо загрузить их выше первых 64 КБ перед передачей им выполнения. [20] Для программ, которые не определяются автоматически, можно использовать LOADFIX [21] или MEMMAX  -L [21], чтобы принудительно загрузить программы выше первых 64 КБ.

Этот трюк использовался как самим IBM/Microsoft Pascal , так и программами, скомпилированными с его помощью, [22] [23] [10] [17] включая MASM от Microsoft . [17] Другими часто используемыми утилитами разработки, использующими это, были исполняемые компрессоры , такие как Spacemaker от Realia [20] (написанный Робертом Б. К. Дьюаром в 1982 году и использовавшийся для сжатия ранних версий Norton Utilities [24] [25] [26] [27] ) и EXEPACK от Microsoft [19] [20] [1] [28] [17] (написанный Рубеном Борманом в 1985 году), а также эквивалентная опция /E[XEPACK] в LINK 3.02 и выше от Microsoft. [19] [1] [28] [26] Программы, обработанные с помощью EXEPACK, отображали сообщение об ошибке «Упакованный файл поврежден». [1] [20] [28]

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

Современные устаревшие загрузчики BIOS (например, GNU GRUB ) используют линию A20. [3] Загрузчики UEFI используют 32-битный защищенный режим или 64-битный длинный режим .

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

Ссылки

  1. ^ abcdefg Пол, Маттиас Р. (2002-02-02). "Treiber dynamisch nachladen (Intra-Segment-Offset-Relokation zum Laden von TSRs in die HMA)" [Динамическая загрузка драйверов (внутрисегментное смещение для загрузки TSRs в HMA)] (на немецком языке). Группа новостей : de.comp.os.msdos. Архивировано из оригинала 2017-09-09 . Получено 2017-07-02 .(Примечание. Дает всесторонний обзор истории и «природы» HMA и неочевидных ограничений дизайна, которые необходимо соблюдать при разработке резидентных системных расширений для загрузки в HMA, некоторые из которых вызваны шлюзом A20. Также описывается, как решать эти проблемы с помощью заглушек , бэкдоров и перемещения смещения внутри сегмента — метода, используемого драйверами DR-DOS, способными перемещаться в HMA и аналогичного (более сложному) методу, используемому в качестве основы для динамического устранения мертвого кода в драйвере FreeKEYB автора.)
  2. ^ Пол, Маттиас Р. (11.04.2002). "Re: [fd-dev] ОБЪЯВЛЕНИЕ: CuteMouse 2.0 alpha 1". freedos-dev . Архивировано из оригинала 21.02.2020 . Получено 21.02.2020 .
  3. ^ ab "A20 Line". OSDev Wiki . 2021-07-19. Архивировано из оригинала 2021-11-30 . Получено 2021-07-19 .
  4. ^ Шэнли, Том; Андерсон, Дон (1995). Свиндл, Джон (ред.). Архитектура системы ISA (3-е изд.). Mindshare, Inc. / Addison-Wesley Publishing Company . стр. 79–80. ISBN 0-201-40996-8. ISBN 978-0-201-40996-3 . [1]
  5. ^ «Представление упрощенной архитектуры Intel для будущего». intel.com . Intel . Получено 22.05.2023 .
  6. ^ Шэнли, Том (1996). Архитектура программного обеспечения защищенного режима . Тейлор и Фрэнсис . стр. 60. ISBN 0-201-55447-X.
  7. ^ "Глава 3 Система ПК". Руководство по проектированию систем ПК 2001 (PDF) . Корпорация Intel и корпорация Microsoft. стр. 52 . Получено 03.06.2023 . SYS–0047. A20M# всегда неактивен (подтянут к высокому уровню) на процессоре
  8. Руководство системного программиста Intel, том 3A, июнь 2013 г.
  9. ^ abc 86-DOS - Disk Operating System for the 8086 - Programmer's Manual (PDF) . Версия 0.3 (Предварительное издание). Сиэтл, Вашингтон, США: Seattle Computer Products, Inc. 1980. стр. 7, 17. Архивировано из оригинала (PDF) 2019-06-23 . Получено 2011-09-13 . […] Эта форма предоставляется для упрощения перевода программ 8080/Z80 в код 8086 и не рекомендуется для новых программ. […] Размер памяти. Это количество байтов, доступных в сегменте программы. […](41 страница)
  10. ^ ab Letwin, James (1985-04-10). "Метод и операционная система для выполнения программ в многорежимном микропроцессоре". Microsoft . US06722052, US4779187A. Архивировано из оригинала 2018-09-23 . Получено 2018-09-23 . […] Некоторые программы, написанные для 8086, полагаются на [переход адреса] для правильной работы. К сожалению, области памяти простираются выше 1 мегабайта в реальном режиме 80286 и не переносятся в области с низкой памятью. Следовательно, программы, включая написанные на MicroSoft PASCAL , и программы, которые используют функцию "Call 5" MS-DOS, не будут работать в стандартной системе 80286. […] Например, программы PASCAL не загружаются в память объемом ниже 64 Кбайт , а специальная инструкция размещается в нижних ячейках памяти объемом выше 1 мегабайта, например, по адресу 100000h или 100010h. […]{{cite web}}: CS1 maint: бот: исходный статус URL неизвестен ( ссылка )
  11. ^ Тейлор, Роджер; Леммонс, Фил (июнь 1982 г.). «Восходящая миграция — часть 1: Трансляторы — использование программ перевода для переноса программ CP/M-86 на CP/M и MS-DOS» [Использование программ перевода для переноса программ CP/M на CP/M-86 и MS-DOS] (PDF) . BYTE . Том 7, № 6. BYTE Publications Inc. стр.  321– 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344 [342, 344]. ISSN  0360-5280. КОДЕН  BYTEDJ. Архивировано (PDF) из оригинала 2020-01-16 . Получено 15.01.2020 . […] Получение доступа к CP/M-86 […] Получение доступа к CP/M-86 требует размещения кода функции в регистре CL, размещения параметра байта в регистре DL или размещения параметра слова в регистре DX, размещения сегмента данных в регистре DS (сегмент данных обычно не изменяется для преобразованной программы) и выполнения программного прерывания INT #224 . Результат возвращается в регистре AL, если это значение байта; если результат является значением слова, он возвращается в регистрах AX и BX. Значения двойного слова возвращаются со смещением в регистрах BX и сегментом в регистре ES. Таким образом, преобразование программ из CP/M-80 в CP/M-86 требует замены вызова ячейки 5 на программное прерывание INT #224. Другое необходимое изменение касается теплой загрузки . В CP/M-80 доступ к горячей загрузке может быть получен с помощью системного вызова с кодом функции 0 для перехода к местоположению 0. Однако CP/M-86 не поддерживает переход к местоположению 0. В результате вы должны изменить этот выход программы в транслируемой программе, если программа должна работать правильно. При условии, что вызов к местоположению 5 заменен на INT #224, что изменение горячей загрузки выполнено и что регистры отображены правильно, не должно возникнуть особых проблем с получением транслируемой программой доступа к системным функциям CP/M-86. […] Получение доступа к MS-DOS […] Хотя MS-DOS имеет «предпочтительный» механизм через программное прерывание, INT #33 , для доступа к системе, предусмотрен дополнительный механизм для «предшествующих» программ, совместимый с соглашениями о вызовах CP/M-80, по крайней мере для функций в диапазоне 0-36. Что касается системных вызовов в пределах допустимого диапазона функций, программисту не нужно ничего делать с транслируемыми программами, чтобы они работали под MS-DOS, кроме как правильно сопоставить регистры. MS-DOS также поддерживает функцию теплой загрузки CP/M-80. Переход к местоположению 0 под MS-DOS вызывает программное прерывание INT #32 , которое функционально является концом программы и обычным способом выхода из программы. […][2] [3][4][5][6][7][8][9][10][11][12][13][14][15] (13 страниц)
  12. ^ аб Шеперс, Арне (1991). «Глава 5: EXEC im Detail — Префикс сегмента программы (PSP)». DOS 5 для программистов: Die endgültige Referenz (на немецком языке) (1-е изд.). Аддисон Уэсли (Дойчланд) ГмбХ . С.  148–151 , 971–972 [149, 971–972]. ISBN 3-89319-350-2.(1123+v страниц, раскладной, 5,25-дюймовая дискета)
  13. ^ ab "Формат префикса сегмента программы (PSP)". INTER61 . 2000. Архивировано из оригинала 2020-02-17 . Получено 2019-12-19 .
  14. ^ abcd Necasek, Michal (2011-09-13). "Кому вообще нужен перенос адреса?". Музей OS/2 . Архивировано из оригинала 2020-02-19 . Получено 2020-02-19 . […] 86-DOS , а следовательно, и PC DOS / MS-DOS , использовали хитрый трюк. Байт по смещению 5 PSP содержал код операции дальнего вызова (9Ah); слово по смещению 6 PSP содержало соответствующее значение для указания размера сегмента программы, а также смещенную часть дальнего вызова. Слово по смещению 8, которое служило сегментной частью дальнего вызова, было создано таким образом, что при объединении со смещением оно переносилось (хорошо понятная функция ЦП 8086 ) и указывало на адрес 0:C0h, который содержит вектор прерывания 30h. […] Проблема с интерфейсом совместимости возникает, когда загруженная программа фактически имеет менее 64 КБ. Если это происходит, слово по смещению PSP 6 может не содержать правильного значения, но интерфейс CALL 5 все равно будет работать; инструкция по смещению 5 будет CALL 0:C0h, что делает сообщаемый размер сегмента программы C0h. Неясно, почему DOS так делает; похоже, это ошибка в DOS 5.0 и более поздних версиях, так как DOS 4.0 и более ранние версии просто корректируют часть сегмента так, чтобы она переносилась на 0:C0h. Это работает, пока размер сегмента программы выровнен по абзацу, и так и будет. […]
  15. ^ Нортон, Питер (1985). Руководство программиста Питера Нортона по IBM PC (Иллюстрированное издание). Корпорация Microsoft . ISBN 0-91484546-2. ISBN 978-0-91484546-1 . стр. 263: […] С помощью процесса, слишком странного и сложного для объяснения, сегментированный адрес устанавливается так, чтобы он выполнял две функции. Он не только указывает на диспетчер функций DOS, но и смещенная часть также указывает, какую часть сегмента кода мы можем использовать (до шестнадцатеричного FFF0, на 16 байт меньше 64 КБ). Смещенная часть адреса, часть, которая нас интересует, расположена по смещению 6 в PSP, следуя за кодом операции инструкции по смещению 5. Результатом этого является то, что если у DOS есть менее 64 КБ для предоставления нашим программам, мы можем использовать это поле, чтобы узнать, сколько байтов доступно — метод, который должен работать с большинством или всеми оконными и многозадачными системами. […] (426 страниц)
  16. ^ ab "Caldera OpenDOS Machine Readable Source Kit (MRS) 7.01". Caldera, Inc. 1997-05-01 [1997-04-16]. Архивировано из оригинала 2021-08-07 . Получено 2022-01-02 . […] BIOSINIT.A86 1.40 93/11/11 12:25:29 […] Изменения заголовка VDISK […] BIOSINIT.A86 1.39 93/11/08 23:19:22 […] SetupHMA выполняет инициализацию CALL5 […] теперь исправляет JMPF в hi-memory для ссылки CALL5 для PC-NFS […] [16] (Примечание. OpenDOS 7.01 MRS: IBMBIO\BIOSINIT.A86 SetupHMA )
  17. ^ abcd Necasek, Michal (2018-03-16). "A20-Gate: It Wasn't WordStar". Музей OS/2 . Архивировано из оригинала 2018-09-23 . Получено 2018-09-23 .
  18. ^ Парсонс, Джефф (2018-05-27) [1987-12-01, 1987-08-02]. "Somebody Put a SPELL On Me". PCjs . Архивировано из оригинала 2019-01-29 . Получено 2019-04-21 .
  19. ^ abc Шульман, Эндрю; Браун, Ральф Д .; Макси, Дэвид; Михельс, Рэймонд Дж.; Кайл, Джим (1994) [ноябрь 1993 г.]. Уильямс, Эндрю (ред.). Недокументированная DOS: руководство программиста по зарезервированным функциям и структурам данных MS-DOS — расширено для включения MS-DOS 6, Novell DOS и Windows 3.1 . Серия программ Эндрю Шульмана (1-е издание, 2-е изд.). Рединг, Массачусетс, США: Addison Wesley Publishing Company . стр. 349–350. ISBN 0-201-63287-X. ISBN 978-0-201-63287-3 . […] Если оставить линию A20 включенной, возникнут проблемы с программами, которые ожидают возникновения переноса […] Одной из таких программ была распаковывающая процедура собственного компоновщика Microsoft , изначально включаемая в любой файл, который был EXEPACKed для уменьшения его размера! По словам Филлипа Гарднера, автора условно-бесплатной утилиты обслуживания DOSMAX UMB и ветерана в области дизассемблирования DOS, печально известное сообщение об ошибке «Packed File Corrupt», которое начало появляться повсюду вскоре после появления DOS 5.0, напрямую связано с тем, что линия A20 включена, а исходная процедура распаковки зависела от эффекта переноса сегмента для правильного расширения сжатых файлов. […] (xviii+856+vi страниц, 3,5-дюймовая дискета [17]) Опечатки: [18][19] (Примечание. На странице 350 книги имеется подробное описание внутренней работы проблемной процедуры распаковки EXEPACK.)
  20. ^ abcde Пол, Маттиас Р. (2002-10-07) [2000]. "Re: masm .com (PSP) related trouble". Группа новостей : alt.lang.asm. Архивировано из оригинала 2017-09-03 . Получено 2017-09-03 . […] DR Concurrent DOS 386 (с 1988-07-08) будет загружать EXEPACK- программы выше отметки 64 КБ, то есть за пределами « самой низкой памяти », расширяя блок памяти, содержащий среду программы […] DR DOS 5.0 + всегда загружает программы формата .EXE без исправлений, а также (с 1990-05-25) программы формата .COM , сжатые SpaceMaker , и, следовательно, начиная с 9Ch 55h (PUSHF/PUSH BP) — выше отметки 64 КБ, чтобы избежать ошибки зацикливания EXEPACK. Он делает это, расширяя блок памяти, содержащий среду программы, с 1989-12-14 он даже выделяет несколько заполнителей, когда это необходимо. Этот код расширения среды отключается, если имя родительской программы, хранящееся в MCB, — «WIN», чтобы повысить производительность, когда WIN.COM запускает KERNEL.EXE (0 элементов перемещения). […] ядро ​​MS-DOS / PC DOS 5.0 +[…] сканирует различные последовательности кода в исполняемых файлах формата .EXE и применяет исправления для различных версий EXEPACK-файлов, чтобы они могли работать в наименьшей памяти (когда DOS находится в HMA ) , то есть в сегменте загрузки < 64 Кб. В противном случае они бы отображали «Упакованный файл поврежден». Код проверяет, что точка входа кода […] не < 0002h […], а затем считывает WORD, непосредственно предшествующее точке входа […] Если это WORD считывает 5242h («RB»), предполагается, что файл EXEPACKed. Затем код ищет одну из нескольких комбинаций последовательностей кода по смещениям от этой сигнатуры «RB». […] ядро ​​MS-DOS 5.0+[…] сканирует неизвестный класс исполняемых файлов .COM . Если их сигнатуры найдены в файле, переменная обратного отсчета A20 по смещению 18h в таблице информации о буфере диска (см. таблицу «Информация о буфере диска DOS 5.0-6.0») будет установлена ​​в 10, что приведет к отключению A20 после вызовов INT 21h для этого количества вызовов INT 21h. Предположительно, этот класс программ требует отключения A20 на некоторое время после начала выполнения. (Аналогичные действия происходят при входе в INT 21h/AH=25h и AH=49h.) […]
  21. ^ аб Пол, Матиас Р. (30 июля 1997 г.) [18 июня 1996 г., 1 мая 1994 г.]. «V.4. Bessere Speicherausnutzung mit selbsthochladenden Programmen». NWDOS-TIPs — советы и подсказки для Novell DOS 7, с просмотром недокументированных подробностей, ошибок и обходных путей. Выпуск 157 (на немецком языке) (3-е изд.). Архивировано из оригинала 4 ноября 2016 г. Проверено 6 августа 2014 г. {{cite book}}: |work=игнорируется ( помощь ) (Примечание. Приведенная ссылка указывает на преобразованную в HTML версию NWDOSTIP.TXT, которая является частью коллекции MPDOSTIP.ZIP.) [20]
  22. ^ Компилятор Pascal (PDF) . Серия Personal Computer Computer Language (1-е изд.). International Business Machines Corporation . Август 1981. Архивировано (PDF) из оригинала 29-05-2020 . Получено 23-09-2018 .
  23. ^ "NAME ENTX - Microsoft MS-DOS Computer Pascal runtime system control". Версия 1.00. Microsoft Corp. 1981. Архивировано из оригинала 2020-02-23 . Получено 2020-02-23 . […] DX - это окончательное значение DS (может быть отрицательным) […] окончательное значение DS (может быть отрицательным) […]
  24. ^ "Экспертный отчет Роберта Б. К. Дьюара в ответ на отчет Кеннета Д. Крюса". Cambridge University Press et al против Patton et al, дело 124, Дополнительные первоначальные раскрытия информации Cambridge University Press, Oxford University Press, Inc., Sage Publications, Inc. - Cambridge University Press, Oxfort University Press, Inc. и Sage Publications, Inc. против Марка П. Беккера, президента Университета штата Джорджия, и др., Гражданский иск № 1:08-CV-1425-ODE (судебный документ). Окружной суд США по Северному округу Джорджии, отделение Атланты. стр. 18. Приложение A. Архивировано из оригинала 01.05.2018 . Получено 23.04.2019 . […] SPACEMAKER и TERMULATOR, стандартное программное обеспечение для IBM PC ( утилита сжатия файлов PC DOS и эмулятор VT-100 ), продаваемое Realia, Inc. RBK Dewar (1982-1983), язык ассемблера 8088, 8000 строк […]
  25. ^ Realia, Inc. (январь 1983 г.). «Если вы используете DOS, вам нужна эта программа». PC Magazine (реклама). 2 (9). Ziff-Davis Publishing : 417. Архивировано из оригинала 22.04.2019 . Получено 22.04.2019 .
  26. ^ ab Dewar, Robert Berriedale Keith (1984-03-13). "DOS 3.1 ASMB (Another Silly Microsoft Bug)". info-ibmpc@USC-ISIB.ARPA . Архивировано из оригинала 2018-05-01 . Получено 2019-04-23 . […] Параметр /E компоновщика должен генерировать EXE-файл, который логически эквивалентен несжатому EXE-файлу. Текущая версия […] приводит к затиранию AX. AX при входе в EXE-файл имеет определенное значение (он указывает на допустимость диска для параметров), поэтому его следует передать в несжатый образ. Учитывая это одно очень очевидное нарушение правил интерфейса, могут быть и другие, я не стал заниматься дальнейшим расследованием […] Я написал программу Realia SpaceMaker , которая делает то же самое, что и опция EXEPACK (но, само собой разумеется, не имеет этого конкретного […]
  27. ^ Necasek, Michal (2018-04-30). "Realia SpaceMaker". Музей OS/2 . Архивировано из оригинала 2019-01-27 . Получено 2019-02-22 .
  28. ^ abc Necasek, Michal (2018-03-23). ​​"EXEPACK и A20-Gate". Музей OS/2 . Архивировано из оригинала 2018-11-13 . Получено 2019-04-20 .

Дальнейшее чтение

  • Брауэр, Андрис Эверт (2001). "A20 - боль прошлого". Архивировано из оригинала 2017-09-09 . Получено 2017-09-09 .
  • Коллинз, Роберт Р. (2001). "A20/Reset Anomalies". Архивировано из оригинала 2017-09-09 . Получено 2017-09-09 .
  • Necasek, Michal (2018-01-30) [2018-01-28, 2018-01-26]. "WordStar Again". Музей OS/2 . Архивировано из оригинала 2019-07-28 . Получено 2019-07-28 .
  • Ingenoso, Tony (1998-12-20). "Глава 13 - A20 gate и HMA". Making Code Work Better - Как минимизировать размер кода 80x86 и иногда делать его быстрее (электронная книга). Архивировано из оригинала 2019-11-18 . Получено 2019-11-18 .
  • Ludloff, Christian (2011). "x86 architecture legacy stuff: KBC, PS/2, and A20M#". sandpile.org . Архивировано из оригинала 2021-08-15 . Получено 2022-01-02 .
Взято с "https://en.wikipedia.org/w/index.php?title=A20_line&oldid=1248522708"