我正在为RISC-V架构开发一个定制的Linux内核。现在我正在使用GDB/QEMU进行调试,因为这些工具已经可用。当我在调试时,我注意到我不能访问虚拟化地址的内存。也就是说,一旦内核中的内存从物理寻址转换为虚拟寻址,我就不能再在gdb中访问这些内存位置。例如,内核在QEMU的info mem命令中如下所示。
paddr: 0x80200000 --> vaddr: 0xffffffff80000000我认为这个问题更多的是QEMU的问题,或者可能是我对如何在QEMU中正确访问它的理解。在我的内核中,单步执行到开始使用虚拟内存的这一点是可以的,但是超过这一步会导致QEMU有效地停止--它在每一步都给出相同的指令。但是,如果我继续,它将在QEMU中引导。我如何通过单步执行来调试它?在GDB/QEMU中有什么需要切换的吗?
例如,我确实尝试过访问地址0xffffffff8000007c,但我可以成功地访问它,当我单步超过该点时,QEMU不会转换到虚拟内存。
发布于 2021-02-11 02:11:52
我遇到了一个类似的问题,并形成了以下假设:我认为内核在空闲时正在切换到一个精简的页表,一个不映射已加载模块内存的页表。当然,GDB的异步中断很可能会在空闲时中断CPU。
单个跳出空闲(例如,在Linux控制台中按下一个键之后)并重新尝试在加载的模块上设置断点在某一时刻成功。
一种可行的策略可能是在模块加载代码结束时中断,并在该点设置相关断点。
https://stackoverflow.com/questions/62395719
复制相似问题