我在完成我的操作系统课程的实验室时遇到了这个问题。我们正在尝试实现一个具有系统调用功能的内核(平台:QEMU/i386)。测试内核时,出现问题,内核将用户程序加载到内存并使用' iret '指令将CPU状态从内核模式更改为用户模式后,CPU以如下奇怪的方式工作。
你的来宾可能最终执行了一块已清零的内存。在 i386 中,归零内存反汇编为一系列“add BYTE PTR [rax],al”指令,每个指令长两个字节(0x00 0x00),如果 rax 恰好指向读取为零的内存,这将有效是一个 2 字节的 inn 无操作,它对应于你所看到的。这可能是因为你错误地设置了 iret 并且它没有返回到你期望的地址,或者因为你的 MMU 设置错误并且用户空间程序不在你期望的内存中,因为实例。
你可以使用 QEMU 的调试选项(例如-d in_asm,cpu,exec,int,unimp,guest_errors -D qemu.log
将大量执行信息记录到文件中)来确认这一理论,它应该(在许多其他数据中)向你显示它实际执行的指令。
非常感谢!您的解决方案确实对我有很大帮助。搞糊涂的原因是我把EIP认作Program Counter,但其实是CS+EIP。因此我在 gdb 指令布局上看到的并不是 QEMU 真正执行的指令。