我正在尝试在 Bochs 中启动自定义内核。但是,当我尝试运行它时,Bochs 会在几秒钟内向我的终端生成数十万条输出行。它们都包含相同的信息:
00017895741e[CPU0 ] read_virtual_checks(): read beyond limit
我正在使用由 创建的映像dd if=/dev/disk3s1 of=Boot.img
,其中 disk3s1 是我的 Mac 的 DMG 安装驱动程序使用的原始设备。(这个镜像在 QEMU 下启动得很好,但是由于我的内核和 QEMU 之间不兼容,我现在必须使用 Bochs。)这是我的 bochsrc 文件的内容:
megs: 1024
ata0-master: type=disk, path=Boot.img, mode=flat, cylinders=0
boot: disk
我已将问题的原因追溯到这些组装说明。正在发生的事情是 CPU 刚刚切换到实模式,因此它可以进行 BIOS 中断。在切换之前,要在 BIOS 中断中使用的寄存器已保存到由符号new_eax
、new_edx
和指示的内存位置new_es
。一旦进入实模式,程序就会从适当的内存位置重新加载寄存器。要读取的内存位置的线性地址是0x000200c8
。然而,因为我们处于实模式,我们必须使用段相对寻址——在这种情况下,ds:0x000100c8
. 但是,ds
寄存器的值是0x2000
。当与偏移量结合时,我们得到线性地址0x000300c8
,这是无效的。“读取超出限制”消息是 Bochs 抱怨地址无效。它被打印这么多次的原因是因为无效指令在无限循环中一次又一次地运行。
再次强调,这个完全相同的代码在 QEMU 中运行良好。我无法理解为什么会这样。
这是我正在运行的引导加载程序的完整反汇编和我的引导加载程序的C 源代码(特别是参见boot2
和libsaio
子目录),如果有帮助的话。