ARM上的浮点运算 eabi oabi busybox (Kernel panic - not syncing: Attempted to kill init!)

ARM9平台Linux内核移植实战:从2.6.29.4配置到YAFFS2根文件系统部署 嵌入式Linux系统开发中,内核移植与文件系统构建是核心基础环节。其原理在于通过交叉编译工具链,将针对特定处理器架构优化的Linux内核源码编译为可在目标硬件上运行的二进制镜像。这一过程的技术价值在于实现对底层硬件的精准控制与资源高效利用,是连接硬件平台与应用软件的桥梁。典型应用场景包括工业控制、物联网设备及消费电子等领域,开发者常需根据具体硬件调整内核配置、驱动及启动参数。本文聚焦于经典ARM9平台,详细解析Linux 2.6.29.4内核的配置、关键驱动(如NAND Flash与DM9000网卡)的适配 阅读详情
 

这篇文章对最近遇到上的ARM上浮点运算的问题做一个总结。
首先,我们先看一下ARM处理器是如何处理浮点运算的。
交叉编译器在编译的时候,对于浮点运行会预设硬浮点运算FPA(Float Point Architecture),而没有FPA的CPU,比如SAMSUNG S3C2410/S3C2440,会使用FPE(Float Point Emulation 即软浮点),这样在速度上就会遇到极大的限制。也就是说如果有浮点协处理器则交给它去做,如果没有则会产生一个陷阱(trap,处理器响应异常的机制), 而我们事先准备好针对浮点指令的陷阱处理程序就可以通过软件来模拟浮点运算指令。
然后,我们解释一下OABI和EABI这两个概念。
/********************************************************************************************/
以下部分转载至http://linux.chinaunix.net/bbs/thread-1143604-1-1.html。
1。什么是ABI
ABI,application binary interface (ABI),应用程序二进制接口。
既然是 接口,那就是某两种东西之间的沟通桥梁,此处有这些种情况:
A。应用程序 <-> 操作系统;
B。应用程序 <-> (应用程序所用到的)库
C 。应用程序各个组件之间
类似于API的作用是使得程序的代码间的兼容,ABI目的是使得程序的二进制(级别)的兼容。
2。什么是OABI 和 EABI
OABI中的O,表示“Old”,“Lagacy”,旧的,过时的,OABI就是旧的/老的ABI。
EABI中的E,表示“Embedded”,是一种新的ABI。
EABI有时候也叫做GNU EABI。
OABI和EABI都是专门针对ARM的CPU来说的。
3。EABI的好处 / 为何要用EABI
A。支持软件浮点和硬件实现浮点功能混用
B。系统调用的效率更高
C。后今后的工具更兼容
D。软件浮点的情况下,EABI的软件浮点的效率要比OABI高很多。
4。OABI和EABI的区别
两种ABI在如下方面有区别:
A。调用规则(包括参数如何传递及如何获得返回值)
B。系统调用的数目以及应用程序应该如何去做系统调用
C。目标文件的二进制格式,程序库等
D。结构体中的 填充(padding/packing)和对齐。
E。
OABI:
* ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa
* gcc -dumpmachine: arm-unknown-linux
* objdump -x for compiled binary:
private flags = 2: [APCS-32] [FPA float format] [has entry point]
* "file" on compiled Debian binary:
ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, stripped
* "readelf -h | grep Flags""
Flags: 0x0
EABI:
* ABI flags passed by gcc to binutils: -mabi=aapcs-linux -mfloat-abi=soft -meabi=4
* gcc -dumpmachine: arm-unknown-linux-gnueabi
* objdump -x for compiled binary:
private flags = 4000002: [Version4 EABI] [has entry point]
* "file" on compiled binary (under Debian):
ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), for GNU/Linux 2.4.17, stripped
* "readelf -h | grep Flags""
Flags: 0x4000002, has entry point, Version4 EABI
/********************************************************************************************/
在虚拟机中,运行:arm_v5t_le-gcc -dumpmachine,输出:armv5tl-montavista-linuxeabi;
运行arm_v5t_le-readelf -h EXEC | grep Flags,(注:EXEC代表用交叉编译工具编译的可执行文件名),输出:Flags: 0x4000002, has entry point, Version4 EABI。
上述结果说明当前使用的montavista的编译器是符合EABI标准的。
使用EABI(Embedded Application Binary Interface)则可以对此改善处理,ARM EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。
看到这里,之前遇到的一个问题终于弄明白了。之前在Makefile中一直包含一个-mabi=apcs-gnu的参数,而apcs-gnu是OABI的 参数,因此将OABI的参数传给符合EABI标准的编译,编译阶段没有报错,但在板上运行时,程序中涉及到浮点数的部分出现了许多莫名的问题。比如 printf("%s %f",s,f);这句话输出的浮点数值并不是传给printf的参数,而是一个莫名其妙的数字。解决办法:在Makefile中将 “-mabi=apcs-gnu”去掉,重新编译运行,成功!
转载一篇相关文章http://blog.chinaunix.net/u1/38994/showart_2023807.html。
使用arm-linux-gcc 4.3.2编译必须启用内核中的Use the ARM EABI选项
不知道为什么使用arm-linux-gcc-4.3.2.tgz (with EABI) 86MB
编译同样的东西就是出现如下错误,感觉可能是busybox 1.14.3的问题,因为使用arm-linux-gcc-4.3.2编译出来的zImage可以使用正常挂在arm-linux-gcc-3.4.1编 译器编译出来的动态busybox和库,但是使用arm-linux-gcc-4.3.2.tgz 编译出来的静态busybox就是会出现下面的错误,开始觉得明显是应用程序出了问题.后来发现原来是内核自己的事情,因为arm-linux-gcc- 4.3.2.tgz使用了EABI方式,所以这就需要内核同样配置EABI编译属性才能支持EABI编译出来的应用程序 busybox[luther.gliethttp]
错误原因:没有选择Use the ARM EABI to compile the kernel选项
Kernel Features
[ ] Use the ARM EABI to compile the kernel
解决方法:将它寻上之后自动多出下面一行,这样再次编译的内核就ok了,嘿嘿:)
[*] Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL) (NEW)
ep93xx-rtc ep93xx-rtc: setting system clock to 1970-01-01 00:01:18 UTC (78)
Freeing init memory: 100K
Kernel panic - not syncing: Attempted to kill init!
Backtrace:
[<c00259c0>] (dump_backtrace+0x0/0x114) from [<c026d674>] (dump_stack+0x18/0x1c)
r7:c5818000 r6:c5817a40 r5:c5817a40 r4:c03291c4
[<c026d65c>] (dump_stack+0x0/0x1c) from [<c026d6c4>] (panic+0x4c/0x120)
[<c026d678>] (panic+0x0/0x120) from [<c00406e0>] (do_exit+0x70/0x58c)
r3:c0313004 r2:c5817a40 r1:c5819d0c r0:c02cbdcb
[<c0040670>] (do_exit+0x0/0x58c) from [<c0040c90>] (do_group_exit+0x94/0xc8)
[<c0040bfc>] (do_group_exit+0x0/0xc8) from [<c004ae40>] (get_signal_to_deliver+0x2ec/0x324)
r7:c5293a74 r6:c5818000 r5:c5819ed4 r4:00000004
[<c004ab54>] (get_signal_to_deliver+0x0/0x324) from [<c0024024>] (do_signal+0x58/0x528)
[<c0023fcc>] (do_signal+0x0/0x528) from [<c0024524>] (do_notify_resume+0x30/0x34)
[<c00244f4>] (do_notify_resume+0x0/0x34) from [<c0021e8c>] (work_pending+0x1c/0x20)

arm-none-eabi-gcc编译选项(ChibiOS) demo: ChibiOS/demos/STM32/RT-STM32F407-DISCOVERY arm-none-eabi-gcc -c # 编译、汇编到目标代码,不进行链接 -mcpu=cortex-m4 # cpu架构的优化选项 -O2 # 更多的优化,会尝试几乎全部的优化功能,但不会进行“空间换时间”的优化方法 -ggdb # 为调试器 gd 阅读详情

相关推荐

ARM下Kernel panic - not syncing: Attempted to kill init!错误分析

ARM下Kernel panic - not syncing: Attempted to kill init!错误分析 1. 前言       最近在通过busybox制作rootfs的时候,发现使用不同版本的交叉编译器去编译busybox的时候,有些版本编译器编译出的busybox可执行文件不能用,它会导致系统启动过程中在加载init程序时出错。本文将分析怎么去查找这个错误具体是由什么引

chuanzhilong的博客 2万+

Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

二进制模----细微行动改变影响世界 3193

ROS实践(四)机器人SLAM建图(gmapping)

本文介绍了SLAM技术及其实现方法。SLAM(同步定位与地图构建)让机器人在未知环境中通过传感器数据自主定位并构建地图。文章详细讲解了激光雷达、RGBD相机等常用传感器,以及gmapping和map_server这两个ROS功能包的使用方法。重点阐述了SLAM建图实验步骤:配置gmapping节点参数、启动机器人仿真、运行gmapping节点、使用rviz可视化工具、通过键盘遥控机器人完成地图构建并保存。实验结果表明,该方法能有效实现机器人自主建图功能,为后续导航等应用奠定基础。

qq_1033275663的博客 4331

JZ2440移植根文件系统及Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004问题

使用交叉编译工具分别查看,arm-xx-readelf -A vmliux 和 根文件系统下的bin/busybox,主要查看他们的编译的

AF_goal的博客 876

Proteus+汇编+8086电子时钟实战:从框架搭建到中断驱动的核心实现

本文详细介绍了使用Proteus仿真软件和8086汇编语言实现电子时钟的完整过程。从程序框架搭建、内存分段模型理解,到核心的8259中断控制器配置与编程,再到中断服务程序编写和数码管动态扫描显示驱动,系统阐述了底层软硬件协同开发的核心原理与实战步骤。该项目是深入理解计算机中断机制和汇编语言编程的绝佳实践。

weixin_29189381的博客 413

DCA决策曲线的解读和代码实现

0.决策曲线 决策曲线分析法(Decision Curve Analysis,DCA)是个与ROC曲线相提并论的相对比较新的模型评价方法。 关于它的原理,长篇大论的医学统计学知识解读实在不是我的强项,放上两个链接偷偷懒: https://www.plob.org/article/12455.html https://www.iikx.com/news/statistics/1622.html 如果想看文章,这篇里的fig7就是:https://www.ncbi.nlm.nih.gov/pmc/artic

weixin_42960896的博客 1万+

【嵌入式人工智能产品开发实战】(十一)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的链接过程】

在一个C项目的编译中,编译器以C源文件为单位,将一个个C文件翻译成对应的目标文件。生成的每一个目标文件都是由代码段、数据段、BSS段、符号表等section组成的。这些section从目标文件的零偏移地址开始按照顺序依次排放,每个段中的符号相对于零地址的偏移,其实就是每个符号的地址,这样程序中定义的变量、函数名等,都有了一个暂时的地址。 这些目标文件是不可执行的,它们需要经过链接器链接、重定位后才能运行。 链接主要分为3个过程:分段组装、符号决议和重定位。

政安晨——致力于AI人工智能数字互动领域 1308

SAR图像降噪:基于小波变换和双边滤波器的Matlab实现

小波变换和双边滤波器是常用的图像降噪技术,它们可以在保持图像细节的同时有效抑制噪声。本文介绍了基于小波变换和双边滤波器的SAR图像降噪方法,并提供了相应的Matlab源代码。通过对比原始图像和降噪后的图像,可以观察到噪声得到一定程度的抑制,同时保留了图像的细节信息。本文将介绍一种基于小波变换和双边滤波器的方法,用于SAR图像的降噪,并提供相应的Matlab源代码。希望这篇文章能够帮助您理解基于小波变换和双边滤波器的SAR图像降噪方法,并为您提供实现该方法的Matlab源代码。对图像的高频部分进行降噪处理。

ScriptCharm的博客 839

arm-linux/elf/eabi 交叉编译器

arm的交叉编译器有三种类型(命名方式):arm-linux-, arm-elf-, arm-eabi- arm-linux: 一般用于编译linux程序,使用glibc库 arm-linux-elf: 用于编译uclinux或其他程序,使用嵌入式库,如uclib或newlib等。 arm-eabi: 是符合eabi规范的交叉

沉淀 1975

在 SAP 中,寄售业务(Consignment)与管道业务(Pipeline)都属于“物料先到、发票后到”的特殊采购模式,但两者的库存形态、物权转移时点、结算触发条件、系统配置完全不同

SAP中寄售业务与管道业务均属"先货后票"采购模式,但存在本质差异。寄售业务(如手机芯片)采用实物库存管理(标记"K"),物权在领用时转移,通过411K/201K移动类型触发负债;管道业务(如蒸汽)无实物库存,采用261P等移动类型直接消耗并生成应付。系统配置上,寄售需K类信息记录及GR收货,管道需P类信息记录且免GR。两者均通过MRKO汇总结算,但寄售按领用量计费,管道按提取量实时计费。核心区别在于库存形态与物权转移时点。

金牌架构师 555

看28377代码笔记

使用的是20MHz外部晶振,为取200MHz系统时钟,倍频设为20,分频设为2,这样sysclock = 20MHz * 20 / 2,正好200MHz。注意:SPISTE配置成普通的GPIO端口,是为了更好控制芯片,配置芯片的时序。FMULT_0:小数点位数,小数只能有0,0.25,0.5,0.75四个选择。XTAL_OSC:表示使用外部晶振。GPIO_MUX_CPU1:复用类型。GPIO_MUX_CPU1:复用类型。PLLCLK_BY_2:表示2分频。IMULT_20:表示倍频数。

小柚子的博客 805

TI Davinci DM6446开发攻略——开发环境搭建

         TI DAVINCI DM6446的开发环境搭建不像三星S3C2410,S3C2440,ATMEL的AT91SAM9260之类的单核ARM那么简单,因为DM6446还有DSP端的开发环境,以及双核之间的通信和程序编译等问题,所以开发攻略第一步就是要搭好开发环境。其实TI的EVM(TI 的开发板)也提供相关的EVM start guide(sprue66f.pdf),适合参考。 ...

weixin_33690963的博客 259

Kubernetes(K8s)从入门到精通系列之一:一篇文章了解K8s全部核心知识点

Kubernetes(K8s)从入门到精通系列之一:一篇文章了解K8s全部核心知识点

zhengzaifeidelushang的博客 849

Kernel panic - not syncing: Attempted to kill init

在把Linux内核3.6.10移植到s3c2410开发板上的时候,创建init进程时出现如下错误,我的init进程编译时采用的是静态链接 Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004 Backtrace: [] (dump_backtrace+0x0/0x10c) from [] (

lpangbing的专栏 4237

基于simulink的预测电流控制策略的三相逆变器仿真

本文详细介绍了在Simulink中实现基于预测电流控制策略的三相逆变器仿真方法。主要内容包括:准备工作(安装必要软件及工具箱)、构建三相逆变器基础模型、设计预测电流控制器(包含状态空间建模和控制器设计)、实现控制逻辑、添加示波器观察输出、配置仿真参数以及运行仿真分析结果。通过MATLAB代码示例和Simulink模块说明,展示了如何选择最优开关状态来最小化电流误差。该仿真方法为研究快速响应、高精度的逆变器控制提供了实用工具,但需注意实际应用中可能需要的调试工作。

amy_mhd的博客 273

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Kernel paic -not syncing: Attempted to kill init!---- linux2.6.32.移植到TQ2440

这篇文章重点在于探讨移植linux2.6.32和busybox到TQ2440开发板上可能出现的问题分析 对于移植过程,请按照指导书上的内容按部就班操作 问题1. 卡死 描述  文件系统不能加载 Copy linux kernel from 0x00200000 to 0x30008000, size = 0x00200000 ... Copy Kernel to SDRAM

萧瑟一笑的专栏 3060

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

opencv1.0.0移植到DaVinci dm6467

转载自:http://blog.sina.com.cn/s/blog_a1fed07c0101b8qz.html 一、环境: 1.       虚拟机:ubuntu12.04 2.       目标板:DaVinci DM6467 3.       交叉编译器:arm_v5t_le-gcc mv_pro5.0 注:DaVinci使用的是montavista的lin

自用博客 2187

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

linux内核编译问题

1 内核编译命令   编译非压缩内核: make Image   编译压缩内核:   make zImage   编译可被u-boot支持的内核: make uImage 最后生成的内核都在 $(src_tree)/arch/arm/boot目录下   2 make uImage   需要使用u-boot提供的mkimage工具,把这个文件拷贝到/usr/bin或/bin目录

wxl1986622的专栏 1872

arm-linux/elf/eabi交叉编译器

原文:http://blog.chinaunix.net/uid-25871104-id-2950902.html arm的交叉编译器有三种类型(命名方式):arm-linux-, arm-elf-, arm-eabi arm-linux一般用于编译linux程序,使用glibc库,arm-linux-elf用于编译uclinux或其他程序,使用嵌入式库,如uclib或newlib等。

gchww的专栏 2980

使用arm-linux-gcc 4.3.2编译必须启用内核中的Use the ARM EABI选项

文章出处:http://blog.chinaunix.net/u1/38994/不知道为什么使用arm-linux-gcc-4.3.2.tgz (with EABI) 86MB编译同样的东西就是出现如下错误,感觉可能是busybox 1.14.3的问题,因为使用arm-linux-gcc-4.3.2编译出来的zImage可以使用正常挂在arm-linux-gcc-3.4.1编译器编译出来的动态busybox和库,但是使用arm-linux-gcc-4.3.2.tgz 编译出来的静态busybox就是会出现下

qt_girl的专栏 656

浅谈EABI和OABI

浅谈EABI和OABI 引言 初学嵌入式linux开发的时候大家都用的工具链版本多是3.4.5或3.4.2,名字为arm-linux-gcc或arm-softfloat-linux-gnu-gcc,可突然有一天发现这几个版本的编译器无法编译最新的内核了,并且发现人们都换了工具链了(arm-none-linux-gnueabi-gcc)。于是也都换成了这个工具链,编译内核,制作跟文件系统...

系统运维 368

arm-linux-androideabi——选项说明

http://www.fx114.net/qa-59-85000.aspx root@Ubuntu32:/home/zhangbin/android/android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin# ls arm-linux-androideabi-addr2line   arm-

张同光 (Tongguang Zhang):Hello everyone ! 6181
上一篇: 内核配置选项之CONFIG_AEABI
下一篇: kernel panic, no oops, no stack dumped
flymachine
博客等级 码龄23年 253粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值