我开发了一个 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/