преобразовать строку в float в загружаемом модуле ядра Linux, используя c-язык - PullRequest
1 голос
/ 17 сентября 2011

Я разрабатываю LKM на C, используя eclipse cdt для ядра Linux, версия 2.6.38 (ubuntu)

В моем 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-файл представляет собой буфер символов, и, более того, опять же, как мне преобразовать строку в число с плавающей точкой, я снова столкнусь с той же проблемой.

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Мне нужен алгоритм преобразования чисел в число с плавающей запятой, который не использует стандартную библиотеку C, поэтому я написал один. Также не используется математика с плавающей запятой. Я описал алгоритм и опубликовал код в моей статье . Код имеет хороший синтаксический анализатор, обрабатывающий все условные обозначения научной нотации. Он также поддерживает правильную генерацию +/- бесконечности и +/- нуля, в соответствии с IEEE754.

1 голос
/ 19 сентября 2011

Одна из основных причин, по которой ядро ​​не разрешает операции FPU, заключается в дополнительных издержках, которые он добавляет к переключению контекста.Всякий раз, когда процессор переключается из пространства пользователя <-> ядра, необходимо заменить набор регистров.Добавление контекста FPU было бы исключительно неэффективным.

Однако ядро ​​фактически реализует некоторый код с плавающей запятой.Это делается для эмуляции FPU (предоставляя эмулированный FPU для пространства пользователя).Я подозреваю, что возможно было бы кое-что исправить, чтобы использовать подпрограммы эмуляции для получения примитивов FPU, которые не влияют на пространство пользователя.

Однако я думаю, что вам действительно нужно подумать, нужна ли вам арифметика с плавающей запятой внутриваш модуль ядра?Может ли какое-то решение с фиксированной точкой не решить вашу проблему?

...