Строка A20

редактировать

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

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

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

Содержание

  • 1 Обзор
  • 2 A20 gate
  • 3 Обработчик A20
  • 4 Затронутые программы
  • 5 См. Также
  • 6 Ссылки
  • 7 Дополнительная литература

Обзор

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

F000:FFFF
FFFF: 000F
F555: AAAF
F800: 7FFF

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

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

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

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

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

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

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

Шлюз A20

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

В том, что, возможно, было "взломом", шлюз A20 изначально был частью контроллера клавиатуры на материнской плате, который мог открывать или закрывать его в зависимости от желаемого поведения.

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

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

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

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

Обработчик 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 для реализации CP Точка входа CALL 5 в стиле / M в префиксе сегмента программы (PSP) (который частично напоминает нулевую страницу CP / M ). Это, в частности, использовалось программами машинным переводом с CP / M-80 на переводчиками языка ассемблера, такими как Seattle Computer Products 'TRANS86. Обработчик CALL 5, на который ссылается эта точка входа, находится по физическому адресу 0x000000C0 (перекрывая запись для INT 30h и первый байт INT 31h в реальном режиме таблице векторов прерываний ). Однако, по замыслу CP / M-80, 16-битный целевой адрес 8080 / Z80, хранящийся по смещению 6 на нулевой странице, также может быть сознательно интерпретирован как размер памяти сегмента.. Чтобы эмулировать это в DOS с его схемой адресации сегмент: смещение 8086, 16-битное смещение точки входа дальнего вызова должно соответствовать этому размеру сегмента (например, 0xFEF0), который хранится по смещению 6 в PSP, перекрывая части ВЫЗОВ 5. Единственный способ согласовать эти требования состоял в том, чтобы выбрать значение сегмента, которое при добавлении к 0xFEF0 дает адрес 0x001000C0, который на 8086 превращается в 0x000000C0.

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

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

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

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

Когда ядро ​​DOS переместилось в области с более высокой памятью, для программ все больше стала доступна меньшая память, что привело к сбою программ, зависящих от цикла. Загрузчики исполняемых файлов в более новых версиях DOS пытаются обнаружить некоторые распространенные типы затронутых программ и либо исправлять их на лету, чтобы они работали также в малой памяти, либо загружают их выше первых 64 КБ перед передачей им выполнения. Для программ, которые не определяются автоматически, можно использовать LOADFIX или MEMMAX -L, чтобы программы загружались выше первых 64 КБ.

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

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

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

См. Также

Ссылки

Дополнительная литература

Последняя правка сделана 2021-06-07 18:35:23
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте