程序集 qemu-system-i386:尝试在 RAM 之外执行代码

Assembly qemu-system-i386: Trying to execute code outside RAM

我在玩 qemu 的时候遇到这个错误,"qemu-system-i386: Trying to execute code outside RAM"

gdb 上,我得到了这个,所以它停留在 movl 并且当我执行 stepi 时,所有崩溃:

=> 0xf010002c <relocated>:      add    %al,(%eax)
relocated () at kern/entry.S:74
74              movl    [=10=]x0,%ebp                       # nuke frame pointer
(gdb) stepi
Remote connection closed

当我评论执行的 kern/entry.S 行时发生了这种情况:

movl    %eax, %cr0

真正的解释是什么?因为这部分代码说了很多做的事情,但是我真的不明白为什么,如果我注释掉那行代码,它就爆炸了。

entry:
movw    [=12=]x1234,0x472           # warm boot


movl    $(RELOC(entry_pgdir)), %eax
movl    %eax, %cr3
# Turn on paging.
movl    %cr0, %eax
orl $(CR0_PE|CR0_PG|CR0_WP), %eax
movl    %eax, %cr0

mov $relocated, %eax
jmp *%eax

那个QEMU错误意味着"your guest program just jumped off into some invalid location";它几乎总是有缺陷的客户程序的结果,但它以前是 QEMU 的仿真无法处理的。在较新版本的 QEMU 中(从 3.1 开始,尚未发布)我们将能够处理 RAM 以外的执行,因此我们将能够继续模拟来宾。当然,由于从随机未映射的内存中执行是没有意义的,因此来宾很可能只是坐在一个循环中接受异常,或者坐在那里显然什么都不做。

在这种特殊情况下,您已经注释掉了启用 MMU 的代码行,因此在启用分页的假设下紧接着它跳转到虚拟地址的代码将在尝试执行时崩溃跳转目标处的指令,因为在没有启用 MMU 的情况下,该地址没有任何内容。