浅谈linux kernel对于浮点运算的支持
目前大多数CPU都支持浮点运算单元FPU,FPU作为一个单独的协处理器放置在处理器核外,但是对于嵌入式处理器,浮点运算本来就少用,有些嵌入式处理器就会去掉浮点协处理器。
X86处理器一般都是有FPU的。而ARM PPC MIPS处理器就会出现没有FPU的现象。
linux kernel如何处理浮点运算,我们就分为带FPU的处理器和不带FPU的处理器来讨论。
(以下为个人知识总结,研究不深,错误之处希望大家指正,共同学习)
一 对于带FPU的处理器
1 对于linux kernel来说,kernel本身编译默认使用了-msoft-float选项,默认编译为软浮点程序,软浮点含义是有gcc编译器模拟浮点运算(glibc库提供),将浮点运算代码替换为定点运算。
对于带FPU的处理器,我们可以将编译选项-msoft-float去掉,一般是在arch/xxx/Makefile中。将kernel编译为硬浮点,也就是让处理器的浮点指令计算浮点,
硬浮点运算肯定要比模拟的定点运算效率高。(kernel代码中一般不会有浮点运算,所以效率影响不大)
2 对于运行在kernel上的app来说,特别是对于图形程序,如QT,浮点运算较多,我们直接编译即可,因为处理器支持浮点运算,支持浮点运算指令。
二 对于不带FPU处理器
1 对于linux kernel来说,编译默认使用了-msoft-float选项,默认编译为软浮点程序,linux kernel编译不依赖链接任何库,kernel中来实现对应的模拟浮点ABI。
2 对于运行在kernel之上的app来说,如何处理浮点运算,这里就有2种方法了:
(1)由kernel来模拟软浮点.
应用程序使用硬浮点直接编译(编译器默认就是编译成硬浮点程序)。
而对于kernel,我所了解的PPC MIPS处理器都有专门的浮点运算异常处理,程序运行碰到浮点指令,无法运行浮点指令时,硬件会产生相应的中断异常,kernel浮点异常处理程序根据指令内容进行软浮点模拟操作,将运算结果返回之后再恢复到用户空间执行。
对于ARM我在其异常介绍中没有找到对于浮点计算的异常入口,但是kernel中也有对于其软浮点的支持,
在配置ARM Linux内核时,应该都会看到这样的配置:
menu "Floating point emulation" comment "At least one emulation must be selected" config FPE_NWFPE ...
这个是用来配置在内核里面模拟浮点处理器。
具体ARM如何实现支持异常模拟软浮点,具体实现有时间还需要仔细看代码,在arch/arm/nwfpe中。
这样的方式好处在于应用程序不需要重新编译,需要在kernel中把浮点模拟打开即可,使用起来非常方便。
但是缺点也很明显,每次浮点操作都要触发中断异常,用户空间和内核空间切换,执行效率太低。
(2)使用软浮点重新编译app
这样可以避免上述问题,app编译时需要连接glibc库的,使用 msoft-float,使用glibc的模拟浮点,替换为定点运算,这样的好处是运行性能上会好一些。
但缺点是因为使用了不同的编译选项,使用的ABI可能就发生了变化,如果某个库或者应用没有使用同样的编译选项(ABI不同),
系统运行时会出现意想不到的情况,甚至造成崩溃。
根据最近对PPC一款处理器的调试记录,kernel正常启动进入console后死在某一地址,用户空间浮点运算多,询问IC后得知FPU去掉,而处理器浮点异常没有使能。
这样遇到浮点指令,处理器不会触发异常,也不知道该如何运行该指令。
所以进行kernel移植时对于处理器有无FPU也要搞清楚,如果处理器去掉了FPU,而核没有做相应的处理(使能浮点异常),那么APP的浮点指令运行结果就是无法预测的,这时可以采用软浮点工具链来编译APP。
这里有一点思考:
对于一款处理器,处理器设计中有浮点异常(MIPS PPC都是),其外也可以接FPU。
在接FPU后,处理器核内就要屏蔽掉浮点异常,不然浮点运算还是产生浮点异常,FPU就没有实用意义了。
无FPU,则处理器核内要使能浮点异常,不然就跟我上面遇到的问题一样,处理器不知道该如何运行该浮点指令,结果就无法预测了。
以上这篇浅谈linux kernel对于浮点运算的支持就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 浅谈linux kernel对于浮点运算的支持
相关文章
- 支持32位Linux最大内存支持之极限(32位linux最大内存)
- Linux安装中文语言包:一步步实现(linux安装中文语言包)
- Linux支持的最大硬盘容量:测试结果(linux最大硬盘容量)
- 免费Linux安全保护:体验自由、开发安全(免费linux安全软件)
- Linux下的除法运算:深入探索(linux除法运算)
- Linux开放源码的优势(-c-olinux)
- 中国力量:支持国产Linux操作系统(国产linux操作系统)
- 印象笔记 Linux版:实现便捷笔记记录!(印象笔记linux)
- 支持红帽Linux系统支持中文安装(红帽linux安装中文)
- 支持Linux支持中文:简单、快速、高效。(linux打中文)
- Linux支持的股票行情:开启金融投资新时代(linux股票行情)
- Linux运维培训机构:展现专业服务价值(linux运维培训机构)
- 深入研究Linux系统配置文件(linux系统配置文件)
- 参数Linux查看内核参数的方法(linux查内核)
- 管理Linux云计算薪资管理:实现更简单高效的管理(linux云计算薪资)
- Linux的发展之路:分支繁衍(linux的分支)
- 深入了解Linux参数个数:为高效运维提供有效支持(linux参数个数)
- Linux操作系统支持的长文件名是什么?(linux长文件名)
- 【Linux系统快速配置自启动】(linux配置自启动)
- 自动化Linux作业自动化:实现无缝操作(linux作业)
- Linux系统中配置的协议管理策略(linux系统的协议)
- 支持 Linux系统支持中文:开启你的多语言世界(linux系统中文)
- Linux QT支持中文交互体验(linux qt 中文)
- Linux:全面硬件支持保障你的体验(linux 硬件支持)
- Linux系统:为技术无限可能提供强大支持(linux系统能干什么)