PA-RISC 调试¶
好的,这里有一些关于调试 linux/parisc 底层部分的提示。
1. 绝对地址¶
目前许多汇编代码在实模式下运行,这意味着使用的是绝对地址,而不是内核其他部分所使用的虚拟地址。要将绝对地址转换为可以在 System.map 中查到的虚拟地址,请加上 __PAGE_OFFSET(目前为 0x10000000)。
2. HPMC¶
当实模式代码尝试访问不存在的内存时,你会得到一个 HPMC,而不是内核 oops。要调试 HPMC,请尝试查找系统响应者(System Responder)/请求者(System Requestor)地址。系统请求者地址应与(其中一个)处理器 HPA(I/O 范围中的高地址)匹配;系统响应者地址则是实模式代码尝试访问的地址。
系统响应者地址的典型值是大于 __PAGE_OFFSET (0x10000000) 的地址,这意味着在实模式代码尝试访问之前,虚拟地址没有被转换为物理地址。
3. Q 位相关的那些事¶
某些非常关键的代码必须清除 PSW 中的 Q 位。当 Q 位被清除时,CPU 不会更新中断处理程序用于查找机器被中断位置的寄存器——所以如果你在清除 Q 位的指令和再次设置它的 RFI 指令之间发生了中断,你就不知道它究竟发生在什么地方。如果你运气好,IAOQ 会指向清除 Q 位的指令;如果运气不好,它会指向任何地方。通常 Q 位问题会表现为无法解释的系统挂起,或运行超出了物理内存范围。