我可以在Linux内核中调用任何GCC内建函数吗?

3
一些GCC内置函数处理浮点值:http://gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Other-Builtins.html 由于Linux内核默认不支持浮点运算,这是否意味着我不能在Linux内核模块中使用这些内置的GCC函数?
如果我进行以下操作,那么是否可以使用它们(假设我在x86系统上):
kernel_fpu_begin();

float x = 3.14;
x = __builtin_ceil(x);

kernel_fpu_end();

1
很可能这些使用浮点寄存器。我也会担心您会损坏用户浮点寄存器状态。 - artless noise
你可能可以在内核中调用非浮点GCC内置函数(例如__builtin_prefetch...),但是你想在内核中使用浮点,这是不可能的。 - Basile Starynkevitch
参见:在Linux内核中使用浮点数 - artless noise
1个回答

3

Linux内核不允许在内部使用浮点数,因为在x86上使用浮点数需要使用一个特殊的寄存器栈来保存和恢复。只有非整数是必需的极少数情况下,才会使用定点数(即,假设有十进制或二进制小数点的整数运算)。


我知道这一点,但我一直在想,为最近的处理器启用浮点运算是否像人们说的那样代价高昂(无论是在代码补丁还是运行时性能方面)... - Basile Starynkevitch
我猜测它变得更加昂贵了...处理器速度快了很多,但内存并没有太大提升。 - vonbrand
但是缓存确实更大(而且某种程度上更快) - Basile Starynkevitch
+1 参见:Cygnus浮点博客中的相同内容。如果你付出努力编码,固定点几乎总是更好的选择。 - artless noise
1
@artlessnoise,Linux 不会为内核保存它。如果我的进程执行系统调用并返回,则浮点状态不会改变 --> 获胜! - vonbrand
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接