我正在阅读Robert Love的"Linux内核开发",我看到了以下段落:
没有(简单)使用浮点
当用户空间进程使用浮点指令时,内核管理从整数到浮点模式的转换.使用浮点指令时内核必须做的事情因架构而异,但内核通常会捕获陷阱,然后启动从整数到浮点模式的转换.
与用户空间不同,内核不具备对浮点的无缝支持,因为它无法轻易捕获自身.在内核中使用浮点需要手动保存和恢复浮点寄存器以及其他可能的杂务.简短的回答是:不要这样做!除极少数情况外,内核中没有浮点运算.
我从来没有听说过这些"整数"和"浮点"模式.究竟是什么,为什么需要它们?这种区别是否存在于主流硬件架构(例如x86)上,还是特定于某些更奇特的环境?从进程和内核的角度来看,从整数模式到浮点模式的转换到底需要什么?
我正在使用x86 CentOS 6.3(内核v2.6.32)系统.
我将以下函数编译成一个简单的字符驱动程序模块作为实验,以了解Linux内核如何对浮点运算做出反应.
static unsigned floatstuff(void){
float x = 3.14;
x *= 2.5;
return x;
}
...
printk(KERN_INFO "x: %u", x);
Run Code Online (Sandbox Code Playgroud)
编译的代码(这是没有预料到的)所以我插入了模块并检查了日志dmesg
.日志显示:x: 7
.
这看起来很奇怪; 我以为你不能在Linux内核中执行浮点运算 - 除了一些例外kernel_fpu_begin()
.模块是如何执行浮点运算的?
这是因为我在x86处理器上吗?
我在内核中找不到很多SIMD指令(如SSE/AVX)(除了一个用于加速RAID6奇偶校验计算的地方).
Q1)是否有任何特定原因或仅缺少用例?
Q2)如果我想使用SIMD指令,比如设备驱动程序,今天需要做什么?
Q3)将像ISPC这样的框架纳入内核(仅用于实验)有多难?
我想修改linux内核.
我想.so
在文件中使用共享库(文件)中的函数kernel/panic.c
.
不幸的是我不知道如何编译它.
当我把它放入Makefile
我收到以下错误:
ld: attempted static link of dynamic object
.
有没有办法将共享库文件放到Linux内核中,或者我需要重新编译我的库以获取目标文件.