assembly - 如何使用汇编 (NASM) 从 CD-ROM 将内核加载到内存中

标签 assembly operating-system kernel nasm bootstrapping

我正在为自己编写 bootstrap 和内核, bootstrap 和内核都将刻录在 CD-R 上,并将用作 CD-live。它不是 linux CD-Live 或其他东西,完全是我自己的 bootstrap 和内核。我不想使用其他 booloader(即 GRUB),所以请不要建议我使用它们。

这是我的问题:
在我的引导加载程序 ASM 代码中,我想将我的内核和内核条目加载到 RAM 来自光盘 (不是来自硬盘或软盘),让我们假设我们知道内核在 CD-ROM 上的确切位置(扇区号)。
据我所知,我必须使用 int 0x13, AH = 02h 它将扇区从 Drive 读入 RAM。
为了使用这个中断服务,我必须设置几个我将在下面列出的寄存器:
参数:
啊 02h
AL 扇区读取计数
CX Track + Sector/见备注
DH 头
DL 驱动器
ES:BX 缓冲区地址指针

我的问题是关于DL和DH。为了指向第一个硬盘驱动器读取,我们可以将其设置为80h,或者对于软盘我们可以将其设置为00h。但我想从 CD-ROM 读取,我不知道我必须为 DH 和 DL 使用什么值。

为了从 CD-ROM 读取 几个扇区进入 RAM 它是一个正确的中断(int 0x13)吗?如果是,我应该为 DH 和 DL 赋予什么值(value)。

问候,
波利亚。

最佳答案

为了使 BIOS 从 CD 加载引导扇区,您需要使用 "El Torito" 使 CD 可引导。标准。

一旦你使用它,你有两个选择
一种。模拟 - BIOS 模拟软盘或硬盘驱动器,您可以通过设备 00 或设备 80 的 INT13 调用读取内核。
湾该设备不模拟,您可以使用 INT13 ExtendedRead 函数直接从 CD 读取。

要了解这是如何完成的,请查看 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.

关于assembly - 如何使用汇编 (NASM) 从 CD-ROM 将内核加载到内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/856050/

相关文章:

operating-system - 为什么操作系统软件是从硬盘加载而不是从ROM芯片加载?

linux - 如何检查 vsyscall 模式

assembly - 在模式 13 中读取像素时出现错误数据(386 程序集 - DOS)

assembly - `000000q`是什么意思?

c - 事件和信号量的区别

c - C 中的竞争条件

linux - iwlist() 命令如何扫描无线网络?

linux-kernel - 为什么我们需要中断上下文?

winapi - 将寄存器/整数打印到控制台 | FASM | WinAPI

汇编语言随机数生成器