В настоящее время я читаю файл 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 кажется скудным по этой теме.