我在asm/i387.h中使用kernel_fpu_begin
和kernel_fpu_end
函數來保護Linux內核模塊內某些簡單浮點算法的FPU寄存器狀態。在kernel_fpu_end之前調用kernel_fpu_begin兩次
我很好奇在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
調用之後,我返回雙,這意味着訪問浮點寄存器是不安全的嗎?
我最初的猜測是不使用foo
函數中的kernel_fpu_begin
和kernel_fpu_end
調用;但如果foo
返回雙轉換爲無符號而不是 - 程序員不知道在foo
之外使用kernel_fpu_begin
和kernel_fpu_end
?
從理論上講,如果我產生了一個新的內核線程,調用'kernel_fpu_begin'是否安全,因爲狀態會被保存到不同的'task_struct'結構中呢? – 2013-04-17 19:15:39
當然,在另一個線程的上下文中,你可以再次調用kernel_fpu_begin,因爲你正在創建一個新的執行線程,所以這並不是真正的嵌套用法(一個比喻就是你可以使用'mutex_lock() '在同一個互斥體上兩次,當且僅當你有兩個不同的線程) – Roland 2013-04-17 20:56:01
順便說一下,在'kernel_fpu_begin'中,你碰巧知道爲什麼TS標誌只有在TS_USEDFPU沒有被設置時才被清除;如果TS_USEDFPU未設置,TS標誌是否已經被清除? – 2013-04-17 21:04:06