问题描述
我在完成操作系统课程的实验时遇到了这个问题。我们正在尝试使用系统调用的功能实现一个内核(平台:QEMU/i386)。 测试内核时,问题发生在内核将用户程序加载到内存并将cpu状态从内核模式更改为用户模式后使用'iret' 指令,cpu 以如下奇怪的方式工作。
- %EIP 寄存器每次增加 2,无论当前指令有多长。
- 似乎没有执行任何指令,因为在此期间没有其他寄存器发生变化。
解决方法
您的来宾可能最终执行了一块已清零的内存。在 i386 中,归零内存反汇编为一系列“add BYTE PTR [rax],al”指令,每个指令长两个字节(0x00 0x00),如果 rax 恰好指向读取为零的内存,这将有效是一个 2 字节的 inn 无操作,它对应于你所看到的。这可能是因为您错误地设置了 iret 并且它没有返回到您期望的地址,或者因为您的 MMU 设置错误并且用户空间程序不在您期望的内存中,因为实例。
您可以使用 QEMU 的调试选项(例如,right
将大量执行信息记录到文件中)来确认这一理论,它应该(以及许多其他数据)向您显示它实际执行的指令。