【发布时间】:2013-04-10 19:22:14
【问题描述】:
我正在使用asm/i387.h 中的kernel_fpu_begin 和kernel_fpu_end 函数来保护Linux 内核模块中一些简单浮点运算的FPU 寄存器状态。
我很好奇在kernel_fpu_end 函数之前两次调用kernel_fpu_begin 函数的行为,反之亦然。例如:
#include <asm/i387.h>
double foo(unsigned num){
kernel_fpu_begin();
double x = 3.14;
x += num;
kernel_fpu_end();
return x;
}
...
kernel_fpu_begin();
double y = 1.23;
unsigned z = 42;
y -= foo(z);
kernel_fpu_end();
在foo函数中,我调用kernel_fpu_begin和kernel_fpu_end;但是在调用foo 之前已经调用了kernel_fpu_begin。这会导致未定义的行为吗?
此外,我什至应该在 foo 函数中调用 kernel_fpu_end 吗?我在kernel_fpu_end 调用之后返回了一个double,这意味着访问浮点寄存器是不安全的,对吧?
我最初的猜测是不要在foo 函数中使用kernel_fpu_begin 和kernel_fpu_end 调用;但是如果foo 将 double 转换返回到 unsigned 会怎样——程序员不知道在foo 之外使用kernel_fpu_begin 和kernel_fpu_end?
【问题讨论】:
标签: c linux linux-kernel linux-device-driver kernel-module