Bochs“超越极限”

时间:2016-02-12 01:52:52

标签: assembly i386 bochs

我正在尝试在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_eaxnew_edxnew_es指示的存储单元中。一旦进入实模式,程序将从适当的存储器位置重新加载寄存器。要读取的存储器位置的线性地址是0x000200c8。但是,因为我们处于实模式,所以我们必须使用段相对寻址 - 在这种情况下,ds:0x000100c8。但是,ds寄存器的值为0x2000。当与偏移量结合使用时,我们得到线性地址0x000300c8,这是无效的。 “读取超出限制”的消息是Bochs抱怨地址无效。打印这么多次的原因是因为无效指令在无限循环中一次又一次地运行。

同样,我想强调一下,这个完全相同的代码在QEMU中运行就好了。我无法理解为什么会这样。

以下是the complete disassembly of my running boot loaderthe C source code for my boot loader(特别参见boot2libsaio子目录),如果有帮助的话。

0 个答案:

没有答案