Зачем тестировать порт 0x64 в загрузчике перед переключением в защищенный режим?
В моем курсе MIT OS (686) я нашел код, который мне не понятен. Я пытаюсь понять инструкцию inb $0x64, %al
в boot/boot.S. Насколько я понимаю, он читает один байт из порта данных 0x64 в AL, Что такое порт 0x64? Какое устройство или механизм он проверяет на занятость? Я запутался по поводу комментария в коде Busy? Что означает комментарий и к чему он относится?
# Enable A20:
# For fascinating historical reasons (related to the fact that
# the earliest 8086-based PCs could only address 1MB of physical memory
# and subsequent 80286-based PCs wanted to retain maximum compatibility),
# physical address line 20 is tied to low when the machine boots.
# Obviously this a bit of a drag for us, especially when trying to
# address memory above 1MB. This code undoes this.
seta20.1: inb $0x64,%al # Get status
testb $0x2,%al # Busy?
jnz seta20.1 # Yes
movb $0xd1,%al # Command: Write
outb %al,$0x64 # output port
seta20.2: inb $0x64,%al # Get status
testb $0x2,%al # Busy?
jnz seta20.2 # Yes
movb $0xdf,%al # Enable
outb %al,$0x60 # A20
1 ответ
Что такое порт 0x64?
Порт 0x64 является портом ввода-вывода контроллера клавиатуры.
Контроллер клавиатуры имеет два порта 0x64 и 0x60.
Порт 0x64 (Command Port) используется для отправки команд на контроллер клавиатуры (PS/2).
Порт 0x60 (Порт данных) используется для отправки данных в / из контроллера PS/2(клавиатуры) или самого устройства PS / 2.
Какое устройство или механизм он проверяет на занятость? Я запутался по поводу комментария в коде Busy? Что означает комментарий и к чему он относится?
Приведенный здесь код заставляет процессор опрашивать контроллер клавиатуры PS / 2, чтобы определить, занят ли он.
inb $0x64,%al # Get status
Приведенная выше инструкция считывает регистр состояния контроллера PS / 2 длиной 8 бит. В частности, он пытается прочитать состояние входного буфера - бит 1.
testb $0x2,%al # Busy?
Байт, возвращенный из предыдущей инструкции inb, проверяется здесь. Здесь проверяется состояние входного буфера, чтобы увидеть, заполнен он или нет - бит 1(0x2).
Status Register - PS/2 Controller
Bit Meaning
0 Output buffer status (0 = empty, 1 = full) (must be set before attempting to read data from IO port 0x60)
1 Input buffer status (0 = empty, 1 = full) (must be clear before attempting to write data to IO port 0x60 or IO port 0x64)
2 System Flag - Meant to be cleared on reset and set by firmware (via. PS/2 Controller Configuration Byte) if the system passes self tests (POST)
3 Command/data (0 = data written to input buffer is data for PS/2 device, 1 = data written to input buffer is data for PS/2 controller command)
4 Unknown (chipset specific) - May be "keyboard lock" (more likely unused on modern systems)
5 Unknown (chipset specific) - May be "receive time-out" or "second PS/2 port output buffer full"
6 Time-out error (0 = no error, 1 = time-out error)
7 Parity error (0 = no error, 1 = parity error)
Синтаксис кода сборки x86 Вышеуказанный поток подробно объясняет порт 0x64 и 0x60, указанный здесь.
Также ниже ссылка подробно обсуждает, как используются порты ввода-вывода. Как отправляются адреса портов ввода / вывода и данные?
Порт 0x64 используется контроллером клавиатуры 8042 в исходной системе IBM PS/2. Поскольку 8042 - это микроконтроллер общего назначения, который может запускать программы и имеет программируемые контакты, инженеры IBM решили использовать дополнительные контакты для несвязанных функций - один из контактов используется для сброса ЦП, заставляя его вводить код загрузки.
Другой функцией был вентиль A20 - поскольку 80286 добавил 4 бита в адресную шину, были некоторые программы, которые были написаны для 8086 и ожидали, что адреса будут возвращаться к 0 после 1048575 (2^20 - 1). Итак, инженеры IBM придумали хитроумное решение - ужасный взлом - они использовали дополнительный вывод контроллера клавиатуры, который после загрузки был установлен на 0, и добавили логический элемент И в адресную строку 20, которая использует адресную строку A20 и эту строку из контроллер клавиатуры в качестве входа - по сути, 20-й бит адресной шины ЦП, идущий к контроллеру памяти, обнуляется, если не включен вывод разрешения логического элемента A20.
Конечно, если вы действительно хотите адресовать всю свою память, как это сделала бы любая современная операционная система, вам необходимо снова включить ее.
Соглашение заключается в том, чтобы спросить контроллер, занят ли он, а когда он больше не занят, отправить ему команды (если вы напишете ему команду, когда он занят, могут произойти всевозможные вещи, включая игнорирование команды или быть заблокированным в странном состоянии).