uboot中raise:Signal #8 caught的根本原因

本文分析了在uboot启动时遇到Signal #8 caught异常的情况,指出这通常是因为驱动代码中存在除以0的操作。异常源于arm工具链的__aeabi_idiv函数调用raise发出SIGFPE信号。在uboot中,raise被实现为一个打印错误信息的空函数,导致打印Signal #8 caught。为避免此类问题,需确保驱动代码避免除数为0,并考虑链接libgcc.so及实现raise函数。
摘要由CSDN通过智能技术生成

在移植uboot时编译一切正常,但uboot启动中加载自己写的网卡驱动出现问题,一直在打印raise:Signal #8 caught

google  百度了一番,也有很多人遇到了这个问题,大家都说出了解决问题的办法,

就是自己编写的驱动中有出现除以0的误操作,就会一直打印raise:Signal #8 caught

将除操作改为位移操作,或者避免除数为0,就可以解决这个问题。

那为什么有除以0的操作就会引发raise: Signal #8 caught ? 来分析一番!


遇到错误打印,首先要找到打印来源于哪个函数,在uboot源码中grep一把,找到该打印的来源,在arch/arm/lib/eabi_compat.c中,如下:

int raise (int signum)
{
    /* Even if printf() is available, it's large. Punt it for SPL builds */
#if !defined(CONFIG_SPL_BUILD)
    printf("raise: Signal # %d caught\n", signum);
#endif
    return 0;
}
eabi_compat.c是为符合eabi接口的工具链提供一些通用的函数。

看到raise函数的实现,感觉参数signum好像是代表信号的意思(C语言中变量名是多么重要啊!),想起在网络编程中有一个函数raise是用来自身进程发信号。

那么这里一直打印signal #8 caught&#

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值