OK6410A 开发板 (八) 62 linux-5.11 OK6410A linux应用空间常见的异常情景及分析

发布者:tmgouzi最新更新时间:2022-08-22 来源: csdn关键字:OK6410A  开发板  11 手机看文章 扫描二维码
随时随地手机看文章

应用程序运行的时候,是感觉不到其他进程的

应用程序运行的时候,有三种情况

1. 用户空间执行指令

2. 发生异常陷入内核

6种异常 // 不包括reset异常 , reset 异常发生后就回不来了

3. 退出

正常退出

1.在main函数中使用了return返回 // return之后把控制权交给调用函数

2.调用exit()或者_exit  // exit()之后把控制权交给系统

异常退出

1.调用abort函数

会产生 SIGABRT 信号

2.进程收到某个信号,而该信号是程序中止

SIGINT

SIGFPE 

SIGSEGV

SIGPIPE

SIGALAM


实例1 除0 ,打印 Floating point exception

进程的执行

// 进程A

#include

int main(void){

        int a = 0;

        int b = 5;

        int c = 0;


        printf("press ENTER to dividen");

        getchar();


        c = b/a; //执行到这一句发生 data abort 异常


        return 0;

}

// divide-by-zero

// divide by zero

// https://blog.csdn.net/horacen/article/details/107366457

// bl  0 <__aeabi_idiv>

// libgcc.a 中提供了 __aeabi_idiv

// gcc-4.1.2 中 提供了 /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libgcc.a


代码有没有使用vfp 取决于编译过程

-mfloat-abi=aaa 来指定浮点运算处理方式

-mfpu=bbb来指定浮点协处理的类型

aaa 可取 soft softfp hard

bbb 可取 vfp neon vfpv3 vfpv4 vfpv3-d16 vfpv4-d16


-mfloat-abi=soft // -msoft-float 与 -mfloat-abi 功能类似

// 用cpu寄存器(不用vfp寄存器),将除0 在用户空间用 浮点软件库 实现

// 有没有fpu都不会陷入异常

// gcc 用的 软件浮点库实现 为 mpfr // The MPFR library is a C library for multiple-precision floating-point computations with correct rounding. 

-mfloat-abi=softfp

// 用cpu寄存器(不用vfp寄存器),用vfp指令

// 有fpu,直接执行指令 没有fpu,陷入未定义指令异常,可在异常中模拟该指令

-mfloat-abi=hard

// 用vfp寄存器,用vfp指令

// 有fpu,直接执行指令 没有fpu,陷入未定义指令异常,可在异常中模拟该指令


vfp有没有 开启

从ARMv5开始,就有可选的 Vector Floating Point

启用的话,要按照以下步骤


1.如果在 Normal World 下需要访问 VFP ,那么必须

在 Non-Secure Access Control Register (CP15.NSACR) (即在 CP15 register 1 中的 Coprocessor access register) 中必须启用对 CP10 和 CP11 的访问,这通常是在安全引导加载程序中完成的。

bit[21:20] 0b11

bit[23:22] 0b11

2.置位(不是清0) VFP专用系统寄存器 FPEXC 寄存器中的 bit[30](EN)


next step


下一步可能是 

1.fpu指令的执行

2.浮点软件库的执行

3.未定义指令异常


在这里,根据实际情况来看, 会是 浮点软件库的执行, 浮点软件库由 gcc 提供(不是glibc)

在这里,除0 不是 arm异常 检测到的,而是 gcc提供的浮点软件库 检测到的.


float32 float32_div( float32 a, float32 b )

bExp = extractFloat32Exp( b );

if ( bExp == 0 )

float_raise( float_flag_divbyzero );


--- 其他可能情况下的解释


// 浮点软件库的执行 引起的异常

A coprocessor can partially execute an instruction and then cause an exception. 

This is useful for handling run-time-generated exceptions, like divide-by-zero or overflow. 

However, the partial execution is internal to the coprocessor and is not visible to the ARM processor. 

As far as the ARM processor is concerned, the instruction is held at the start of its execution and completes without exception if allowed to begin execution.

Any decision on whether to execute the instruction or cause an exception is taken within the coprocessor before the ARM processor is allowed to start executing the instruction.


// arm1176 手册上的意思,像是 vfp 异常

The VFP supports all five floating point exceptions defined by the IEEE 754 standard:

• invalid operation

• divide by zero

• overflow

• underflow

• inexact.


You can individually enable or disable these exception traps. 

If disabled, the default results defined by IEEE 754 are returned. 

All rounding modes are supported, and basic single and basic double formats are used.


For full compliance, the VFP requires support code to handle arithmetic where operands or results are de-norms. 

This support code is normally installed on the Undefined instruction exception handler.


信号的发送

SYSCALL_DEFINE0(gettid)

获取进程的pid

SYSCALL_DEFINE3(tgkill,...,pid_t, pid

SyS_tgkill

do_tkill

do_send_specific

do_send_sig_info

send_signal (sig=8, info=0xee1fdee4, t=0xeeb317c0, group=0)


信号的接收

sig_kernel_coredump

do_coredump


用户空间

glibc-2.18/sysdeps/generic/siglist.h

34   init_sig (SIGFPE, "FPE", N_("Floating point exception"))


stdio-common/siglist.c


 23 const char *const _sys_siglist[NSIG] =                                           

 24 {                                                                                

 25 #define init_sig(sig, abbrev, desc)   [sig] = desc,                              

 26 #include                                                              

 27 #undef init_sig                                                                  

 28 };                                                                               

 29 strong_alias (_sys_siglist, _sys_siglist_internal)                               

 30                                                                                  

 31                                                                                  

 32 const char *const _sys_sigabbrev[NSIG] =                                         

 33 {                                                                                

 34 #define init_sig(sig, abbrev, desc)   [sig] = abbrev,                            

 35 #include                                                              

 36 #undef init_sig                                                                  

 37 };


sysdeps/gnu/siglist.c


 25 const char *const __new_sys_siglist[NSIG] =                                      

 26 {                                                                                

 27 #define init_sig(sig, abbrev, desc)   [sig] = desc,                              

 28 #include                                                              

 29 #undef init_sig                                                                  

 30 };                                                                               

 31 libc_hidden_ver (__new_sys_siglist, _sys_siglist)                                

 32                                                                                  

 33 const char *const __new_sys_sigabbrev[NSIG] =                                    

 34 {                                                                                

 35 #define init_sig(sig, abbrev, desc)   [sig] = abbrev,                            

 36 #include                                                              

[1] [2]
关键字:OK6410A  开发板  11 引用地址:OK6410A 开发板 (八) 62 linux-5.11 OK6410A linux应用空间常见的异常情景及分析

上一篇:OK6410A 开发板 (八) 63 linux-5.11 OK6410A linux内核空间常见的异常情景及分析 kernel exception
下一篇:OK6410A 开发板 (八) 61 linux-5.11 OK6410A 进程通信机制1 信号

推荐阅读最新更新时间:2024-11-01 21:46

去年Q4中兴手机美国市占率达11%,升至第四位
集微网消息,据韩国媒体中央日报日文版21日报导,科技市调机构Counterpoint 20日公布调查报告指出,上季(2016年10-12月)在美国智能手机市场上,苹果(Apple)拉大与三星间的差距、市占率达三星的2倍;中国手机品牌厂商中兴通讯(ZTE)借低端大尺寸机型销售的畅销,市占率扬升至11%位居第4位,且市占率首度达2位数(10%以上)、创新高。 Counterpoint指出,上季从安卓(Android)跳槽至iOS(iPhone)的用户数创新高,而这部分是受到Note 7停产的影响,不过因三星Galaxy S7/S7 Edge以及Galaxy J系列机种表现稳,让三星能够持续坐在市占2哥位置。 上季苹果于美国智能手机市场
[手机便携]
重磅新品!研华EI-52边缘智能系统搭载Intel第11代处理器
重磅新品!研华EI-52边缘智能系统搭载Intel第11代处理器,助您开启5G和AI应用时代 2021年 ,中国•台北–全球嵌入式产品及方案供应商研华科技荣幸地宣布推出新品 EI-52高性能边缘智能系统。此款产品设计紧凑,搭载第 11 代Intel Core i5/i3/Celeron处理器,采用即插即用系统设计,为边缘到云端互连和 5G & AI 解决方案而设计。 它包括硬件和软件集成包,内置Edge X Foundry 物联网即插即用开放软件框架和研华的 WISE-DeviceOn 物联网边缘智能软件。 EI-52赋能5G和AI应用,支持AIW 5G模块、Wi-Fi套件、VEGA AI加速模块和FaceView人脸识别I.
[网络通信]
重磅新品!研华EI-52边缘智能系统搭载Intel第<font color='red'>11</font>代处理器
Strategy Analytics公布2011年车用IC供应商排名
日前,Strategy Analytics公布了车用IC厂商排名,前五名依次为瑞萨、英飞凌、意法半导体、飞思卡尔及恩智浦。 其中瑞萨电子汽车电子业务年收入为30亿美元,占据了14%的市场份额。2011年车用IC市场总规模为230亿,较2010年增长11%。 “车用IC厂商在2011年遇到了很多区域性的挑战,包括日本地震、欧洲债务危机以及泰国洪水等,但值得高兴的是,这些厂商经受住了考研,业绩达到两位数以上的增长。”Strategy Analytiics分析师Chris Webber表示。
[汽车电子]
Ubuntu 11.10 下移植 madplay 到 mini2440
今天为了学习移植madplay 花了半天时间,多亏了有丰富的网络资源才让我在一个又一个问题中得到解决的方法。 逛街回来后,马上在 Ubuntu 11.10 下进行madplay 对mini2440的移植,由于有了早上移植madplay的经验之后,晚上的移植工作做得还是比较顺手。 1、解压源代码包 # cd tarball # for f in $(ls *.tar.gz); do tar -zxvf $f –C ../src-arm; done 2、编译madplay及其所依赖的库文件 (1)设定编译器环境变量 在ubuntu命令行下输入 # export CC=arm-linux-gcc (2)编译zlib,因为libid3ta
[单片机]
OK6410开发板裸机DS18B20驱动
相信玩过51的童鞋应该都玩过DS18B20吧,虽然用在ARM11上面,但是操作还是一样,多了一点就是读写IO前需要切换IO方向,其实51在读取之前需要切换到高电平的,这个一般由编译器完成的, /************************************************************************************************************* * 文件名: ds18b20.c * 功能: S3C6410 DS18B20驱动 * 作者: cp1300@139.com * 创建时间: 2012年9月17日22:45 * 最后修改时间:
[单片机]
2011年全球医疗器械市场需要注意的四大要点
  新兴市场需求增加、减少住院时间之需和老龄化社会的到来,被视为医疗器械行业2011年整体表现将强于2010年的重要因素。据医疗保健市场研究出版商Kalorama Information最近发布的《全球医疗器械市场》报告预测,2011年全球医疗器械市场将达到3120亿美元。   Kalorama Information的发行人Bruce Carlson称:“有许多因素助推医疗器械市场的增长,如新兴市场需求的增加、减少住院时间的需要和老龄化社会的到来,这些都是医疗器械市场增长的潜在动力。”   Kalorama Information的报告预测医疗器械市场增长较快的类别为MRI仪器、腹腔镜外科设备和医用手套。   报
[医疗电子]
新浪手机讯 11月3日中午消息,近日,一加在海外官方论坛上
IDC第三季度手机出货量和市场份额对比数据   新浪手机讯 11月3日上午消息,根据市场调研机构IDC最新的研究报告,2017年第三季全球智能手机出货量达3.731亿部,较2016年同期的3.634亿部增长2.7%。这是2017年第二季度智能手机市场出货量萎缩后的一次反弹。   智能手机市场日渐饱和 出货量仍在增长   根据IDC数据显示,在2017年第三季度,三星、苹果、华为、OPPO和小米这几大手机品牌出货量都有所增长,而除了苹果之外,其他四家手机厂商的市场份额也都有所增加。   其实,根据2017年第二季度智能手机出货量的数据来看,智能手机市场已经日渐饱和,开始出现出货量同比下滑的情况。不过到了2017年第三度,智能手机市场
[手机便携]
11.栈的初始化
11.栈的初始化 1.栈的概念: 2.满/空栈: 1.3:升/降栈: 1.4.栈桢的理解: 局部变量是保存在栈中的: Stack.c: 编译和反汇编: 传递参数: Func1: 保存寄存器的值: Main: Func1: Func2:
[单片机]
<font color='red'>11</font>.栈的初始化
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved