使用c语言将字符串转换为linux可加载内核模块中的float

时间:2011-09-16 23:54:20

标签: c linux-kernel floating-point kernel-module

我正在使用eclipse cdt for Linux kernel ver 2.6.38(ubuntu)在C中开发LKM

我的LKM中有以下结构数据类型,其中包含以下成员

struct example {
signed short mem1;
float mem2;
float mem3;
};

我有一个/ proc文件,我希望通过该文件为此LKM提供输入并初始化此结构的数据成员。

我的/ proc文件缓冲区如下所示:

static char procfs_buffer[1024]; 

并且将具有这样的字符串值 "-123,-77.123456,-66.123456,"

我想初始化结构成员,如

mem1 with -123; mem2 with -77.123456; mem3 with -66.123456;

我能够将以上字符串分隔为:

string str1[5] with value 123 ;
string str2[5] with value 77 ;
string str3[8] with value 123456 ;
string str4[5] with value 66 ;
string str5[8] with value 123456

并使用simple_strtol()我将这些字符串转换为长数字。

我能够将str1转换为long,然后将其转换为带符号的短整数乘以负号,并将其分配给mem1

现在,我的问题是浮动成员。由于内核不允许浮点运算,我坚持使用这个。我无法使用整数进行计算。当我尝试编译时我无法插入模块。我知道内核中不可能使用FP。

还有其他方法吗?非常紧急..请有人帮助我...

有人建议我在proc文件缓冲区中使用浮点数的二进制表示,而不是表示为字符缓冲区。但是,我的proc文件是一个char缓冲区,而且,我再次如何从string转换为float,我将再次面临同样的问题。

2 个答案:

答案 0 :(得分:3)

我需要一个不使用标准C库的浮点数转换算法的字符串,所以我写了一个。它也不使用浮点数学。我已经描述了算法并在my article中发布了代码。代码有一个很好的解析器处理科学记数法的所有惯例。根据IEEE754,它还支持正确生成+/-无穷大和+/-零。

答案 1 :(得分:1)

内核不允许FPU操作的主要原因之一是它会增加上下文切换的额外开销。每当处理器从用户< - >内核空间切换时,需要交换一组寄存器。添加FPU上下文将非常低效。

然而,内核确实实现了一些浮点代码本身。它为FPU仿真(为用户空间提供仿真FPU)执行此操作。我怀疑有可能修补一些东西以使用仿真例程来获得不影响用户空间的FPU原语。

但是我认为你真的需要考虑你的内核模块中是否需要浮点运算?某种定点解决方案可以解决您的问题吗?