在移植linux-3.0.8时,报了这个错,详细信息如下:
<1>Unhandled fault: alignment exception (0x801) at 0xc0527f27
<0>Internal error: : 801 [#1] PREEMPT
<d>Modules linked in:
CPU: 0 Not tainted (3.0.8 #33)
PC is at pcpu_dump_alloc_info+0x38/0x230
LR is at pcpu_setup_first_chunk+0x574/0x828
pc : [<c03e2a34>] lr : [<c0015bdc>] psr: 000001d3
sp : c0527ef8 ip : c03e2a14 fp : c0527f5c
r10: c0529190 r9 : c0aae180 r8 : 00000001
r7 : c0ab0000 r6 : 00008000 r5 : c0ab8080 r4 : c0aae180
r3 : 00000001 r2 : 00000000 r1 : 2d2d2d2d r0 : 2d2d2d2d
Flags: nzcv IRQs off FIQs off Mode SVC_32 ISA ARM Segment kernel
Control: 10c5387f Table: 20004019 DAC: 00000015
>>原因分析:从报错信息看出,内核在执行pcpu_setup_first_chunk->pcpu_dump_alloc_info这个地方出问题了,经查询,这是对齐引发的异常, 而这两个函数出现在内核的mm/percpu.c中,还不能随便去掉。在使用较高版本的交叉编译工具编译较早一些的内核时,可能存在这个问题,比如我这个是使用交叉编译工具4.9.1编译内核报这个错,而使用交叉编译工具4.5.1编译却不会出现这个错,比较折中的方法就是编译时加一个选项,如下:
make EXTRA_CFLAGS=-mno-unaligned-access
经过测试,这样编译生成的内核也可以正常运行,没有出现什么异常。