GDB examine命令读取值与直接从同地址加载的值不一致的问题求助
GDB examine命令读取值与直接从同地址加载的值不一致的问题求助
各位大佬好,最近我在给自己的操作系统实现PCIe设备检测逻辑:遍历所有存在的PCIe设备函数,把它们配置空间的物理地址保存到预先分配的内存中。
用QEMU虚拟机测试时,我发现保存的地址数量远超出预期,明显是代码没正确过滤掉不存在的PCIe函数。于是用GDB挂载调试,结果碰到了一个特别诡异的问题:
我把指向PCIe厂商ID(Vendor ID)的物理地址存在RDX寄存器里,现在两种操作得到的结果完全不一致:
- 代码里通过
mov eax, [rdx]直接从这个地址加载值到EAX,得到的是无效数值(比如全0或者无意义的随机值) - 但在GDB里用
x/wx $rdx命令查看同一个地址,得到的却是QEMU模拟设备的合理厂商ID值
我反复确认过,执行这两个操作的间隙,RDX里的地址根本没被修改过,完全是同一个物理地址。现在彻底搞不懂原因了,有没有大佬遇到过类似情况?或者能给我一些排查方向?
补充几个可能相关的细节:
- 我的OS还在早期阶段,目前未开启分页,全程使用物理地址访问
- QEMU版本是7.2.0,GDB版本是12.1,调试的是x86_64架构内核
- 我采用内存映射(MMIO)方式访问PCIe配置空间,而非传统IO端口方式




