汇编qemu-system-i386:尝试在RAM外部执行代码

时间:2018-10-11 04:05:19

标签: assembly x86 qemu bootloader i386

我在玩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    $0x0,%ebp                       # nuke frame pointer
(gdb) stepi
Remote connection closed

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

movl    %eax, %cr0

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

entry:
movw    $0x1234,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

1 个答案:

答案 0 :(得分:3)

该QEMU错误表示“您的来宾程序刚刚跳入某个无效位置”;它几乎总是一个有问题的来宾程序的结果,但是以前这是QEMU的模拟无法处理的。在较新版本的QEMU(从3.1开始,尚未发布)中,我们将能够处理RAM以外的其他事物的执行,因此我们将能够继续模拟来宾。当然,由于从随机未映射的内存执行是没有意义的,因此来宾有可能然后坐在异常循环中,否则坐在那里显然什么也没做。

在这种情况下,您已经注释了启用MMU的代码行,因此,假设启用分页功能,则紧随其后的代码将跳转到虚拟地址,而该代码将在尝试执行指令时崩溃在跳转目标上,因为没有启用MMU,该地址就没有任何内容。