Вопрос:

BIOS дважды читает с одного порта на один и тот же регистр подряд

assembly operating-system bios

333 просмотра

2 ответа

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

Я новичок в сборке. Пытаясь выяснить, что делает BIOS, я использую GDB для его отслеживания. Тем не менее, я нашел что-то действительно странное для меня.
Сегмент кода таков:

[f000:d129]    0xfd129: mov    eax,0x8f
[f000:d12f]    0xfd12f: out    0x70,al
[f000:d131]    0xfd131: in     al,0x71
[f000:d133]    0xfd133: in     al,0x92
[f000:d135]    0xfd135: or     al,0x2
[f000:d137]    0xfd137: out    0x92,al

Интересно, почему BIOS читает с порта 0x71 и 0x92 подряд. Будет ли вторая инструкция покрывать значение, считанное с порта 0x71? Тогда почему он читает с порта 0x71?

Спасибо!

Автор: Jiahao Cai Источник Размещён: 04.03.2017 08:42

Ответы (2)


4 плюса

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

Решение

Порт IO 0x70 - это «регистр индекса CMOS / RTC», а порт IO 0x71 - «регистр данных CMOS / RTC». Чтобы получить доступ к чему-либо в CMOS, вы должны установить индекс, а затем прочитать / записать в регистр данных.

Для некоторых чипов RTC, если вы устанавливаете индекс и не читаете или не записываете в регистр данных, чип остается в неопределенном состоянии. Это означает, что если вы хотите установить индекс на более поздний срок, вы должны прочитать из регистра данных, чтобы избежать «неопределенного состояния» между настоящим моментом и позднее.

Другими словами; прочитанное значение не имеет значения - чтение вызывает побочный эффект, и это побочный эффект, который имеет значение.

Автор: Brendan Размещён: 04.03.2017 08:52

2 плюса

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

Порты 0x70и 0x71являются регистры CMOS .

Лучший список, который я нашел по этой теме , взят из эмулятора BOCHS .
Согласно этому списку код выглядит следующим образом:

mov    eax,0x8f   ; sets 'NMI disabled ' and 'CMOS RAM index' = 64
out    0x70,al    ; write
in     al,0x71    ; any write to 0x70 should be followed by an action to 0x71 or the RTC wil be left in an unknown state.
in     al,0x92    ; read PS/2 system control port A
or     al,0x2     ; set BIT1 = indicates A20 active
out    0x92,al    ; write PS/2 system control port A

Таким образом, этот код отключает NMI и устанавливает линию A20 в активное состояние. Последние три строки реализуют Fast A20 Gate .


Интересно, почему BIOS читает с порта 0x71 и 0x92 подряд

Причина просто в том, что

any write to 0070 should be followed by an action to 0071 or the RTC will be left in an unknown state.

Таким образом, первое чтение (чтение in al,0x71) не служит никакой другой цели, кроме как гарантировать это, и поэтому его результат может быть проигнорирован.

Автор: zx485 Размещён: 04.03.2017 09:08
Вопросы из категории :
32x32