- 论坛徽章:
- 0
|
回复 6# 527639827
说一下我分析的过程吧,虽然我还没法找到这个问题的所在。
我这里的内核是linux-2.6.32.8
grep "imprecise external abort" ./ -r -n
打出来的信息是:
./arch/arm/mm/fault.c:482: { do_bad, SIGBUS, BUS_OBJERR, "imprecise external abort" }, /* xscale */
./arch/arm/mach-iop13xx/pci.c:990: "imprecise external abort" ;
./arch/arm/mach-ixp4xx/common-pci.c:385: hook_fault_code(16+6, abort_handler, SIGBUS, "imprecise external abort" ;
./arch/arm/plat-iop/pci.c:362: hook_fault_code(16+6, iop3xx_pci_abort, SIGBUS, "imprecise external abort" ;
通过上面的这几条信息 可以定位到应该是那个fault.c
再这个文件中 找到了这样一个函数
- /*
- * Dispatch a data abort to the relevant handler.
- */
- asmlinkage void __exception
- do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
- {
- const struct fsr_info *inf = fsr_info + fsr_fs(fsr);
- struct siginfo info;
- if (!inf->fn(addr, fsr & ~FSR_LNX_PF, regs))
- return;
- printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n",
- inf->name, fsr, addr);//很明显那个出错的log信息是这里大出来的
- info.si_signo = inf->sig;
- info.si_errno = 0;
- info.si_code = inf->code;
- info.si_addr = (void __user *)addr;
- arm_notify_die("", regs, &info, fsr, 0);//到这里意味着程序挂了
- }
复制代码 这个好像不是因为不对齐访问引起的 因为不对齐访问的错误码应该是BUS_ADRALN
因为错误码是BUS_OBJERR 定义在asm-generic\siginfo.h中
在内核中的解释是 object specific hardware error
在wiki上有这样一句话
Object-specific hardware error
This is far less common, but it is present in Solaris, when virtual memory pages have disappeared (e.g. accessing an mmaped file which has been truncated.)
希望这点分析对lz有帮助 期待lz解决问题后反馈一下 。@@。 |
|