Linux的段错误原因分析.doc
Linux的段错误原因分析
这是一次启动从内核中打印的消息
[ 19.820000] SysManage: unhandled page fault (11) at 0x43a8b4d8, code 0x017
[ 19.820000] pgd = c0aa0000
[ 19.820000] [43a8b4d8] *pgd=80b16031, *pte *ppte[ 19.820000]
[ 19.820000] Pid: 234, comm: SysManage
[ 19.820000] CPU: 0 Tainted: P (2.6.31 #7)
[ 19.820000] pc : [<40235ae4>] lr : [<40053d6c>] psr:[ 19.820000] sp : bedf8a30 ip : 40235ae0 fp : bedf8b1c
[ 19.820000] r10: bedf8a70 r9 : 40024e00 r8 :[ 19.820000] r7 : 000000e0 r6 : 4005d2a0 r5 : 4005d1c0 r4 : 4005d260
[ 19.820000] r3 : r2 : 40021ab4 r1 : r0 : 43a8b490
[ 19.820000] Flags: nZCv IRQs on FIQs on Mode USER_32 ISA ARM Segment user
[ 19.820000] Control: 0005317f Table: 80aa0000 DAC:[ 19.820000] Function entered at [] from []
[ 19.820000] r5:43a8b4d8 r4:c0c5e640
[ 19.820000] Function entered at [] from []
[ 19.820000] r7:c09d3c34 r6:c0b14160 r5:c0c5e640 r4[ 19.820000] Function entered at [] from []
[ 19.820000] Function entered at [] from []
[ 19.820000] Exception stack(0xc0b0ffb0 to 0xc0b0fff8)
[ 19.820000] ffa0: 43a8b49040021ab4
[ 19.820000] ffc0: 4005d260 4005d1c0 4005d2a0 000000e040024e00 bedf8a70 bedf8b1c
[ 19.820000] ffe0: 40235ae0 bedf8a30 40053d6c 40235ae4ffffffff
[ 124.120000] g_serial gadget: high speed config #2: CDC ACM config
上面显示SysManage程序出现了unhandled page fault错误,下面给出的堆栈信息不充分,必须在用户空间打出该进程的调用堆栈才好定位问题。
要使内核打印出相关消息,需要修改一些配置。
make menuconfig
中配置
Kernel Hacking
[*] Verbose user fault messages
从boot启动内核时传入参数user_debug=0xff。
从以上内核的堆栈消息是通过__do_user_fault打印的,看一下其中控制打印的代码:
#ifdef CONFIG_DEBUG_USER
if (user_debug & UDBG_SEGV) {
printk(KERN_DEBUG "%s: unhandled page fault (%d) at 0x%08lx, code 0x%03x\n",