【发布时间】:2013-03-30 19:42:18
【问题描述】:
我在 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);
编译的代码(这不是预期的)所以我插入了模块并使用dmesg 检查了日志。日志显示:x: 7。
这看起来很奇怪;我以为你不能在 Linux 内核中执行浮点运算——保存一些异常,例如 kernel_fpu_begin()。模块是如何进行浮点运算的?
这是因为我使用的是 x86 处理器吗?
【问题讨论】:
-
为什么内核不能进行浮点运算?
-
你为什么这么惊讶?毕竟,内核模块只是要由 CPU 执行的另一段代码。只要它可以执行你扔给它的操作码,你就可以了。
-
另外,很可能在编译期间执行了算术运算,剩下的就是
return 7;。 -
这里已经回答了这个问题:stackoverflow.com/questions/13886338/… 这个问题更像是一个不那么正确的陈述,答案是解释性的。你可以在内核中做 FP。
-
kernel_fpu_begin()/ end 是不破坏用户空间 FPU 状态所必需的。 没有它,你可以在内核中进行 FP,但你会破坏 FPU 的状态当前进程。 Linux 会进行惰性 FPU 上下文保存,因为某些进程根本不使用 FPU 或 SSE 寄存器。 (不过,越来越多的进程确实使用 SSE。)
标签: c linux gcc linux-kernel x86