Как загрузить ядро ​​в память с CD-ROM с помощью Assembly (NASM) - PullRequest
4 голосов
/ 13 мая 2009

Я пишу загрузчик и ядро ​​для себя, и оба загрузчика и ядро ​​будут записаны на CD-R и будут функционировать как CD-live. Это не linux CD-Live или что-то еще, это полностью мой собственный загрузчик и ядро. Я не хочу использовать другие загрузчики (например, GRUB), поэтому, пожалуйста, не предлагайте мне их использовать.

Вот мой вопрос: В коде моего загрузчика ASM я хочу загрузить свое ядро ​​и запись ядра в RAM с CD-ROM (не с жесткого диска или дискеты) и предположить, что мы знаем, где именно находится ядро. CD-ROM (номер сектора). Насколько я знаю, я должен использовать int 0x13, AH = 02h, который будет считывать секторы из Drive в RAM. Чтобы использовать этот сервис прерываний, я должен установить пару регистров, которые я перечислю ниже: Параметры: AH 02h AL Секторы для чтения Count CX Track + Sector / См. Замечание Глава DH DL Drive ES: BX Buffer Address Pointer

Моя проблема связана с DL и DH. Чтобы указать 1-й жесткий диск для чтения, мы можем установить его на 80h или, для дискеты, установить 00h. Но я хочу читать с CD-ROM и не знаю, какие значения я должен использовать для DH и DL.

Чтобы считывать с CD-ROM пару секторов в ОЗУ это правильное прерывание (int 0x13)? если да, какое значение я должен указать для DH и DL.

С уважением, Pooria.

1 Ответ

9 голосов
/ 13 мая 2009

Чтобы BIOS загрузил ваш загрузочный сектор с компакт-диска, вам необходимо сделать загрузочный компакт-диск, используя стандарт "El Torito" .

Как только вы используете это, у вас есть два варианта
а. Эмуляция - BIOS эмулирует либо дискету, либо жесткий диск, и вы можете прочитать свое ядро ​​через вызовы INT13 с помощью устройства 00 или устройства 80.
б. Устройство не эмулируется, и вы можете читать прямо с компакт-диска с помощью функции INT13 ExtendedRead.

Чтобы увидеть, как это сделать, посмотрите на загрузчик Linux "ISOLINUX" - ISOLINUX.ASM

Чтобы дать более конкретную отправную точку для вашего вопроса, спецификация El Torito, раздел 5.3:

Once the system jumps to segment:0, the program can retrieve its boot
information by issuing INT 13, Function 4B, AL=01.  After the boot process
has been initiated the INT 13 Extensions (functions 41-48) will access the
CD using 800 byte sectors and the LBA address provided to INT 13 is an
absolute sector number. This gives any program running in no emulation mode
the ability to locate the boot catalog, and any other information on the
CD, without providing a device driver.
...