我正在尝试在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
我已将问题的原因追溯到these assembly instructions。发生了什么,是CPU刚刚切换到实模式,因此它可以产生BIOS中断。在切换之前,BIOS中断中使用的寄存器已保存到符号new_eax
,new_edx
和new_es
指示的存储单元中。一旦进入实模式,程序将从适当的存储器位置重新加载寄存器。要读取的存储器位置的线性地址是0x000200c8
。但是,因为我们处于实模式,所以我们必须使用段相对寻址 - 在这种情况下,ds:0x000100c8
。但是,ds
寄存器的值为0x2000
。当与偏移量结合使用时,我们得到线性地址0x000300c8
,这是无效的。 “读取超出限制”的消息是Bochs抱怨地址无效。打印这么多次的原因是因为无效指令在无限循环中一次又一次地运行。
同样,我想强调一下,这个完全相同的代码在QEMU中运行就好了。我无法理解为什么会这样。
以下是the complete disassembly of my running boot loader和the C source code for my boot loader(特别参见boot2
和libsaio
子目录),如果有帮助的话。