Реальный режим x86 ASM: как дела?

В настоящее время я читаю файл boot.s в исходном коде первого в истории ядра Linux (при условии, что 0,01 действительно является первый публичный релиз).

Я знаю C и ASM, последний значительно меньше первого. Даже в этом случае я, кажется, могу понять и по существу понять код в исходных файлах.

Однако этот файл меня сбил с толку. Теперь я понимаю, что это потому, что это в реальном, а не в защищенном режиме. Излишне говорить, что я никогда раньше не видел кода ASM, написанного в реальном режиме. Защищенный режим был де-факто режимом, в котором операционные системы x86 работали еще до моего рождения, так что этого следовало ожидать.

Вот процедура, которую я хочу понять лучше:

/*
 * This procedure turns off the floppy drive motor, so
 * that we enter the kernel in a known state, and
 * don't have to worry about it later.
 */
kill_motor:
    push dx
    mov dx,#0x3f2
    mov al,#0
    outb
    pop dx
    ret

Поискав outb , я обнаружил, что она используется для передачи байтов в порты компьютера. Я рискну предположить, основываясь на документации C, что в этом сценарии байт «остановки двигателя» передается в качестве первого аргумента, а в качестве номера порта дисковода гибких дисков - в качестве второго.

Предоставляется ли этот интерфейс BIOS? Или напрямую с дисковода гибких дисков? Я предполагаю, что в BIOS есть скромные «драйверы» для самой базовой работы всех основных устройств.

Вот где я озадачен: похоже, что числа вроде # 0x3f2 появляются из воздуха. Это явно номера аппаратных портов или что-то в этом роде. Этот файл усыпан такими числами без объяснения того, что они имеют в виду.Где я могу найти исчерпывающий справочник, в котором показаны все аппаратные порты и контрольные номера, которые они могут получить в реальном режиме? Кроме того, похоже, что файл перемещает ядро ​​в памяти во время процессов загрузки с жестко запрограммированными адресами памяти. Где я могу найти руководство о том, какие диапазоны адресов памяти доступны для записи в реальном режиме?

Я также прочитал комментарий Линуса о перепрограммировании прерываний, чтобы избежать конфликта между BIOS и внутренними аппаратными прерываниями. Я не собираюсь лгать, это пролетело над моей головой.

Помощь была бы замечательной; Если вам интересно, Google кажется скудным по этой теме.

9
задан Louis 17 January 2012 в 12:00
поделиться