下边是一个典型的MIPS异常信息表:
备注:在32位CPU(BCM5836)中上述寄存器是32位的;在64位CPU(Bcm1250)上是64位的。
|
【如何阅读】 |
● 异常类型(ExType)
打印该异常的类型名
如:TLB invalid exception (load or instruction fetch)
● 异常线程(current thread)
出现异常的线程名,即current->name和线程栈起止地址。
● CP0异常相关寄存器
MIPS协处理器0负责中断/异常处理,如下几个寄存器都是跟异常或中断相关:
|
寄存器 |
说明 |
|
Cause |
cause[2..6]记录了异常码,即异常类型,上面的异常类型名就是根据这个打印 出来的,所以用户可以不用关心这个。 |
|
Status |
主要跟中断相关,设置中断屏蔽码和异常向量表基址,可不关心。 |
|
EPC |
引起异常的指令的地址,根据该地址你可以找到引起异常的函数。 |
|
ErrPC |
与PC相似,只有在(soft)Reset,NMI,Cache Error时记录引起异常的PC指针。 |
|
RA |
异常所在函数的返回地址,根据这个可以找到引起异常的函数的调用函数。 |
|
BadAddr |
只在TLB异常中有用,引起TLB异常的逻辑地址。如果发现BadAddr值较小 说明是使用程序中用到了空指针。 |
|
ErrCtrl |
处理器相关,对异常判断涌出不大。 |
|
CacheErr |
处理器相关,对异常判断用处不大。 |
● 通用寄存器(GPRs)
打印异常发生时MIPS的32个通用寄存器GPR的值,对异常诊断作用不大。
● MIPS函数堆栈回溯
根据现有MIPS ABI 暂不支持堆栈回溯。
|
【常见异常】 |
MIPS中如下几个异常是最常见的:
● TLB Refill Exception
出现该异常是因为程序访问了一个没有经TLB映射的地址空间,可以根据EPC到相应函数中查找出错的地方。
● TLB Invalid Exception
BCM5836和BCM1250中都将内存的低64K地址空间(0x0à0x10000)映射为NULL区,访问这段地址空间的时候会产生TLB invalid的异常。正常情况下,程序是不会访问这段地址空间的,除非出现了空指针,所以碰到这类异常的时候,最好看看Baddaddr寄存器的值是不是小于0x10000,然后根据EPC到相应函数中查找哪里使用了空指针。
● Bus Error Exception
发起总线请求时,非正常中止。引起Bus Error的原因很多,如PCI控制器还没有初始化,
就去访问对应的PCI空间,肯定会引起Bus Error的。碰到具体问题还是根据EPC找到相应函数,然后用printf来定位问题。
● Address Error exception
即“so called”不对齐访问异常。主要是如下面引起的:
1)不在word自然对齐的边界上取指令。
2)数据访问的时候不是自然对其的,如访问int时不是在四字节对齐的地址上。
MIPS中对不对齐访问都做了处理,所以出现该异常的可能性较小,下面介绍一下MIPS中
在处理不对齐访问时打印的调试信息的含义:
|
handling unaligned load exception |
new_pc : 异常返回时开始执行的地址。
Need_new_ra: 有没有重新设置函数返回地址ra,这一般是在jal这类指令时用到。
Instruction address: 引起不对齐访问的指令的地址。
Instruction code :引起不对齐访问的指令的机器码。
ea: 试图访问的不对齐地址。
● Reserved Instruction Exception
该异常是使用了无法解析的指令引起的,即程序跑飞掉了。一般是程序跳动一个合法的地址,执行了一条CPU无法解析的指令。
● Machine Check Exception
该异常一般是CPU检测到内部出现了某种不一致造成的。如一个逻辑地址被映射到了多个TLB entry时,就有可能出现这种异常。
|
【NULL保护】 |
BCM1250 和 BCM5836都把内存的低64K(0x0->0x10000)映射为NULL区,对该段地址的访问将会引起TLB invalid异常。程序的正常执行不会使用到该段地址,除非用到了空指针。
|
【附表】 |
MIPS中共定义了32种异常,除了上面的常见异常外,还有其他异常,如下:
|
ExcCode (Cause[2..6]) |
Mnemnonic |
Description |
|
0 |
Int |
Interrupt |
|
1 |
Mod |
TLB modification exception |
|
2 |
TLBL |
TLB exception (load or instruction fetch) |
|
3 |
TLBS |
TLB exception (store) |
|
4 |
AdEL |
Address error exception (load or instruction fetch) |
|
5 |
AdES |
Address error exception (store) |
|
6 |
IBE |
Bus error exception (instruction fetch) |
|
7 |
DBE |
Bus error exception (data reference: load or store) |
|
8 |
Sys |
Syscall exception |
|
9 |
Bp |
Breakpoint exception. If EJTAG is implemented and an SDBBP instruction is executed while the processor is running in EJTAG Debug Mode, this value is written to the Debug field to DExcCode denote an SDBBP in Debug Mode. |
|
10 |
RI |
Reserved instruction exception |
|
11 |
CpU |
Coprocessor Unusable exception |
|
12 |
Ov |
Arithmetic Overflow exception |
|
13 |
Tr |
Trap exception |
|
14 |
-- |
Reserved |
|
15 |
FPE |
Floating point exception |
|
16-17 |
-- |
Available for implementation dependent use |
|
18 |
C2E |
Reserved for precise Coprocessor 2 exceptions |
|
19-21 |
-- |
Reserved |
|
22 |
MDMX |
MDMX Unusable Exception. |
|
23 |
WATCH |
Reference to WatchHi/WatchLo address |
|
24 |
MCheck |
Machine check |
|
25-29 |
-- |
Reserved |
|
30 |
CacheErr |
Cache error. In normal mode, a cache error exception has a dedicatedvectorandtheCauseregisterisnotupdated.IfEJTAGis implemented and a cache error occurs while in Debug Mode, this code iswriten to the Debug field to indicate that re-entry DExcCode to Debug Mode was caused by a cache error. |
|
31 |
-- |
Reserved |
本文介绍了MIPS架构中常见的异常类型,如TLB Refill、TLB Invalid、Bus Error、Address Error和Reserved Instruction等,并提供了异常处理时的寄存器信息和分析方法,帮助开发者诊断和解决MIPS系统中的异常问题。
9262

被折叠的 条评论
为什么被折叠?



