当内核发生异常(比如非法地址访问)时,产生Oops,常见的打印如下:
...
BUG:unable to handle kernel paging request at f80c6131
*pdpt=0000000000d08001 *pde=00000000372a0067 *pte=0000000000000000
0ops:0010 [#1] SMP
Modules linked in:...
...
其中的0010即为error code,当异常发生时,由硬件压入栈中。可以通过这个看出Oops发生的大致原因。
对于x86架构来说,error code具体定义如下:
/*
* Page fault error code bits:
*
* bit 0 == 0: no page found 1: protection fault
* bit 1 == 0: read access 1: write access
* bit 2 == 0: kernel-mode access 1: user-mode access
* bit 3 == 1: use of reserved bit detected
* bit 4 == 1: fault was an instruction fetch
*/
enum x86_pf_error_code {
PF_PROT = 1 << 0,
PF_WRITE = 1 << 1,
PF_USER = 1 << 2,
PF_RSVD = 1 << 3,
PF_INSTR = 1 << 4,
};
常用低3位,具体含义为:
1、如果第1位被清0,则异常是由一个不存在的页所引起的;否则是由无效的访问权限引起的。
2、如果第1位被清0,则异常由读访问或者执行访问所引起;否则异常由写访问引起。
3、如果第2位被清0,则异常发生在内核态;否则异常发生在用户态。
所以,上述样例中的error code 0010,表示:
1、异常由无效的访问权限引起,也就是说被访问的地址存在对应的物理页,但是没有权限访问。
2、异常由写操作引起
3、异常发生在内核态
总结来说就是该异常由于在内核态对没有写权限的地址进行写操作时产生。
阅读(938) | 评论(0) | 转发(0) |