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