我在玩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 回答
QEMU错误意味着“您的访客程序刚刚跳转到某个无效位置”;它几乎总是一个错误的客户程序的结果,但它以前是QEMU的仿真无法处理的东西 . 在较新版本的QEMU(从3.1开始,尚未发布)中,我们将能够处理RAM以外的其他内容,因此我们将能够继续模拟来宾 . 当然,由于从随机未映射的内存中执行是没有意义的,因此客户可能只是坐在一个循环中接受异常或以其他方式坐在那里显然什么都不做 .
在这种特殊情况下,您已经注释掉了启用MMU的代码行,因此在假设启用分页的情况下紧跟其后跳转到虚拟地址的代码将在尝试执行跳转时执行指令时崩溃目标,因为没有启用MMU,该地址没有任何内容 .