Linux 寄存器值调试

Linux 寄存器值调试,linux,kernel,paging,mips,objdump,Linux,Kernel,Paging,Mips,Objdump,我有一个崩溃方法的例子。我发现崩溃是由于内存访问错误造成的。内存地址存在于MIPS寄存器a0中。除了一步一步地回溯(演练)objdump(a0从s3获得地址等等),是否有其他方法可以跟踪寄存器是如何获得这个地址的 我还有一个问题 如何在内核中完成分页。内核中不能有虚拟地址的概念,因为它们都已经在内存中了。这个问题是因为在我的崩溃中有一个叫做BADVA(是坏虚拟地址)的东西持有一个坏地址 这是坠机报告 Cpu 0 Registries dump Status: 10000302 KERNEL

我有一个崩溃方法的例子。我发现崩溃是由于内存访问错误造成的。内存地址存在于MIPS寄存器a0中。除了一步一步地回溯(演练)objdump(a0从s3获得地址等等),是否有其他方法可以跟踪寄存器是如何获得这个地址的

我还有一个问题

如何在内核中完成分页。内核中不能有虚拟地址的概念,因为它们都已经在内存中了。这个问题是因为在我的崩溃中有一个叫做BADVA(是坏虚拟地址)的东西持有一个坏地址

这是坠机报告

Cpu 0
Registries dump
Status: 10000302    KERNEL EXL 
**Cause : 00803c08    TLBL**
**BadVA : fdca9b68**
PrId  : 01019378

崩溃的直接原因是没有TLB条目与BadVA中的虚拟地址匹配,并且这是在CPU处于异常模式时发生的

BadVA地址(fdca9b68)位于虚拟地址空间的KSEG2区域中。此区域用于MIPS Linux内核中的映射地址(通常用于内核模块)。我怀疑内核模块中有bug


如果您想了解MIPS CPU中发生了什么,您应该购买并研究。

您是指拆解意义上的“objdump”吗?通常,合适的工具是像gdb这样的调试器。除非崩溃代码是在汇编中编写的,否则您应该查看C源代码级别,而不是原始寄存器。这就是调试器的作用。是的。这是一种拆卸。那只是一次撞车,再也没有发生过。我需要检查地址是否从用户空间传递。好的,我没有注意到这是在内核中。这使得使用调试器变得非常困难,但仍然不是不可能(google
kgdb
)。但是内核日志中应该有一个OOPS报告,可以帮助您进行分析——通常,查看堆栈跟踪和崩溃原因要比单独从错误地址开始并进行反汇编容易得多。谢谢。只是不知道该怎么处理这个糟糕的地址。上面我粘贴的是一个内核死机,内核日志缓冲区包含无法在虚拟地址处理内核分页请求的内容,这种情况再也没有发生过。是什么让这件事如此罕见?