0

我在完成操作系统课程的实验室时遇到了这个问题。我们正在尝试实现一个具有系统调用功能的内核(平台:QEMU/i386)。在测试内核时,出现问题,内核将用户程序加载到内存并使用' iret '指令将CPU状态从内核模式更改为用户模式后,CPU以一种奇怪的方式工作,如下所示。

  • 无论当前指令多长,%EIP 寄存器每次增加 2 。
  • 似乎没有执行任何指令,因为同时没有其他寄存器发生变化
4

1 回答 1

1

您的客人可能最终执行了一块归零的内存。在 i386 中,清零内存反汇编为一系列“add BYTE PTR [rax],al”指令,每个指令都是两个字节长(0x00 0x00),如果 rax 恰好指向读为零的内存,这将有效是一个 2 字节的 insn 无操作,它对应于您所看到的。这可能是因为您错误地设置了 iret 并且它没有返回到您期望的地址,或者因为您的 MMU 设置错误并且用户空间程序不在您期望的内存中,因为实例。

您可以使用 QEMU 的调试选项(例如-d in_asm,cpu,exec,int,unimp,guest_errors -D qemu.log,将大量执行信息记录到文件中)确认这一理论,这应该(在大量其他数据中)向您显示它实际执行的指令。

于 2021-04-09T13:01:01.973 回答