Assembly 中银国际;“超限阅读”;

Assembly 中银国际;“超限阅读”;,assembly,i386,bochs,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

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

我想再次强调,同样的代码在QEMU中运行良好。我不明白为什么会这样


如果有帮助的话,这里是和(特别是参见
boot2
libsaio
子目录)。

行的第一部分可能不是时间戳,而是导致故障的读取地址。@hobbs:它是模拟计时器滴答声的数量。结尾的
e
仅表示它是一个表示错误消息的条目dumb question,但当您返回到实模式时,为什么要使用0x2000的DS。我还没有看过你的代码,但为什么不看DS 0x1000呢?或者,如果需要使用值为0x2000的DS,为什么不从0x000100c8中减去0x10000,并将其用作偏移量,即0x2000:0x00c8=0x200c8。您解决过这个问题吗?我的bootloader也有同样的问题——它在qemu和实际的计算机上工作,但在Bochs中它会得到您描述的错误。via@WilliamHiltond你解决过这个问题吗?我的bootloader也有同样的问题——它在qemu和实际的计算机上工作,但在Bochs中它会得到您描述的错误。