c - 不使用浮点寄存器的浮点常量(Linux内核模块)

标签 c linux linux-kernel

我开发了一个 Linux 内核模块,它需要使用浮点常量。我最近遇到了一个我需要处理的内核构建,它禁止对内核模块使用浮点寄存器。

我所有的浮点运算都可以是编译时的,最后我需要的只是在堆上有一个变量,它是内存中的二进制等价物 特定的浮点常量(变量的声明类型无关紧要)。例如:

const float fval = 3.8 * 0.98 / 1000.0;
const int * const iptr = (const int *)&fval;
const int ival = *iptr;

这很复杂,但希望能阐明我要完成的任务。基本上,我需要在编译期间执行这些步骤,以便我在堆上拥有变量 ival,但不会在编译代码中使用浮点寄存器。

到目前为止,我的 hack-ish 解决方案是针对我需要表示的各种浮点常量值运行上述代码,然后手动将它们的整数表示形式转录到我的模块代码中。

表达得更清楚(而且,是的,我实际上需要在某种意义上使用 float ......我只需要避免在编译模块中使用浮点寄存器)。假设我有:

float val = 3.1415926;

假设它在内存中存储为:0xDA0F4940

有没有办法让编译器在不编译浮点运算的情况下用 0xDA0F4940 填充堆上的内存区域?

最佳答案

使用这样的东西怎么样:

union val {
    float fval;
    int ival;
};

static const union val my_val1 = { .fval = 3.8 * 0.98 / 1000.0 };

int *vp = whatever;
*vp = my_val1.ival;

static const 的使用应该足以防止在运行时进行浮点计算。

关于c - 不使用浮点寄存器的浮点常量(Linux内核模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41617703/

相关文章:

c - lua c api : how to push a string with a null character in the middle?

linux - Docker 容器作为虚拟桌面克隆

c++ - 如何在树莓派上使用c++/libao/alsa通过USB声卡播放音频?

linux - AWK 有助于削减一些值(value)

linux - 如何启用内核菜单配置 - HAVE_SYSCALL_TRACEPOINTS?

linux - Linux 中内核空间和用户空间之间的原子行为?

c - ASM 调用约定

c - 警告说数组赋值中指针和整数之间的比较

linux-kernel - Linux内核中的函数调用程序

c - 使用 GOTO 时 StackFrames 会受到怎样的影响?