我在玩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
答案 0 :(得分:3)
该QEMU错误表示“您的来宾程序刚刚跳入某个无效位置”;它几乎总是一个有问题的来宾程序的结果,但是以前这是QEMU的模拟无法处理的。在较新版本的QEMU(从3.1开始,尚未发布)中,我们将能够处理RAM以外的其他事物的执行,因此我们将能够继续模拟来宾。当然,由于从随机未映射的内存执行是没有意义的,因此来宾有可能然后坐在异常循环中,否则坐在那里显然什么也没做。
在这种情况下,您已经注释了启用MMU的代码行,因此,假设启用分页功能,则紧随其后的代码将跳转到虚拟地址,而该代码将在尝试执行指令时崩溃在跳转目标上,因为没有启用MMU,该地址就没有任何内容。