【问题标题】:Can I call any GCC builtin function inside the Linux kernel?我可以在 Linux 内核中调用任何 GCC 内置函数吗?
【发布时间】:2013-03-28 02:23:12
【问题描述】:

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();

【问题讨论】:

  • 这些很可能使用 浮点 寄存器。我还担心你会破坏 user floating point 寄存器状态。
  • 您可能可以在内核中调用非浮点 GCC 内置函数(例如 __builtin_prefetch...),但您想在内核中使用浮点,这是不可能的。

标签: c linux gcc linux-kernel x86


【解决方案1】:

Linux 内核不允许在内部使用浮点,因为 x86 上的浮点使用特殊的寄存器堆栈,保存/恢复成本很高。需要非整数的(非常)少数地方使用了定点(即具有假定小数点或二进制点的整数运算)。

【讨论】:

  • 我知道这一点,但我一直想知道在最近的内核中为最近的处理器启用浮点是否会像人们所说的那样昂贵(无论是在代码补丁方面还是在运行时性能方面)......
  • 我(疯狂地)猜测它变得(相对)更昂贵......处理器速度更快,内存几乎没有那么多。
  • 但是缓存确实更大(而且速度更快)
  • +1 请参阅:Cygnus floating pointsame on blog。如果您付出痛苦编写代码,定点几乎总是更好。
  • @artlessnoise,Linux 不会为内核保存它。如果我的进程进行系统调用并返回,浮点状态没有改变 --> Win!
猜你喜欢
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多