В настоящее время я читаю файл 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, что этот сценарий передает байт 'stop motor' в качестве первого аргумента, а в качестве номера порта флоппи-дисковода - в качестве второго.
Этот интерфейс предоставляется BIOS? Или непосредственно с помощью дисковода гибких дисков? Я предполагаю, что BIOS имеет скромные «драйверы» для очень простой работы всех основных устройств.
Вот где я в тупике: кажется, что числа вроде #0x3f2
вытаскиваются из воздуха. Это явно номера портов оборудования или что-то в этом роде. Этот файл усыпан такими числами, без объяснения того, на что они ссылаются. Где найти исчерпывающую справку, в которой указаны все аппаратные порты и контрольные номера, которые они могут получить в реальном режиме? Кроме того, кажется, что файл перемещает ядро в памяти во время процессов загрузки с жестко закодированными адресами памяти. Где найти руководство по тому, какие диапазоны адресов памяти доступны для записи в реальном режиме?
Я также прочитал комментарий Линуса о перепрограммировании прерываний, чтобы избежать конфликта между BIOS и внутренними аппаратными прерываниями. Я не собираюсь лгать, это пошло прямо над моей головой.
Помощь была бы отличной; Похоже, Google немного разбирается в этой теме, если вам интересно.