Какую роль играет линия A20 в защищенном режиме?

assembly x86 operating-system kernel gdt

310 просмотра

2 ответа

477 Репутация автора

Я иду через защищенный режим часть x86. Я только что узнал о GDT. Ранее я изучал, что для входа в защищенный режим (т. Е. С использованием всех 32-битных адресных линий) необходимо включить шлюз A20. Итак, код для включения A20 должен быть в 16-битном, верно? Недавно, когда я заходил на сайт wiki.osdev, я обнаружил, что код для включения A20 написан на сборке x86. Сборка X86 создает 32-битные коды операций, которые не могут быть загружены в 16-битном режиме, верно?

пожалуйста, объясните, если это возможно. Спасибо.

Автор: Panther Coder Источник Размещён: 18.07.2016 05:40

Ответы (2)


11 плюса

25462 Репутация автора

Модель адресации 8086 предусматривала 16-битный сегмент и 16-битное смещение, объединенные как segment * 16 + offset.
Минимальный адрес - 000000h , максимальный - 10ffefh .
Хотя последнее технически является 21-битным значением, процессор имел только 20- битную адресную шину, поэтому самый большой доступный адрес был 0fffffh 1

Адреса выше 0fffffh просто обернуты вокруг 2 , поэтому 10ffefh является псевдонимом для 0ffefh .
Некоторые программы начали полагаться на это.

Когда вышел 80286, у него было 24 бита для адресной шины.
Адрес вроде 10ffefh больше не повторялся .
Эмуляция старого поведения требовала слишком много транзисторов в то время ( 10ffefh нельзя замаскировать с помощью AND), поэтому была введена маска A20.

Как следует из названия, адресная строка 20, 21-й бит, была снабжена специальным битом конкретного регистра в микросхеме 8055/8042.
BIOS очищает этот бит при запуске, тем самым сбрасывая 21-й бит в ноль, эмулируя старое поведение.

Если вы не включите A20, 21-й бит каждого физического адреса всегда будет нулевым.


Можно включить A20 в защищенном режиме с плоской моделью, которая ближе всего подходит к «32-битному режиму», но требует осторожности с размещением кода в памяти.

Сборка x86 может использоваться в равной степени для создания 16- или 32-битного кода, просто сообщая ассемблеру целевой размер.


1 Дается, например, сегментом 0f000h и смещением 0ffffh .
2 21-й бит был просто отброшен.
3 Проще говоря, если вы пишете 16- или 32-битный код.

Автор: Margaret Bloom Размещён: 18.07.2016 06:12

-2 плюса

155 Репутация автора

Проблема в том, что если шлюз A20 закрыт, 20-й адресный бит устанавливается в ноль. Например, если вы хотите получить доступ к адресу 0x000100ab, вы на самом деле получаете доступ к 0x000000ab или если вы хотите получить доступ к 0x06570021, вы фактически получаете доступ к 0x0656021 независимо от того, находитесь ли вы в защищенном режиме или в реальном режиме. Причина этого заключается в том, что в реальном режиме вы можете создать физический адрес, который занимает больше 20 битов, например 0x001000ab, например, используя комбинацию сегмент: эффективный адрес FFFF: 00bb, но 8086 урезал ее до 0x000ab, тогда как 80286 или новее получит доступ к 0x001000ab, если будет открыт шлюз A20, что плохо для программ (например, некоторых кодов BIOS), которые используют эту «функцию».

Конечно, закрытый A20 Gate полностью портит вам 20-битный адрес в защищенном режиме, поэтому вы должны убедиться, что он открыт, если вы переключаетесь в защищенный режим.

Автор: sannaj Размещён: 17.03.2017 06:53
Вопросы из категории :
32x32