Как преобразовать функцию вызова макросов в функцию ядра? - PullRequest
0 голосов
/ 31 марта 2019

Мне нужно удалить макрос CEIL, используемый в модуле ядра, и использовать функцию ceil в ядре, чтобы заменить вызывающего макрос.

Я попытался заменить функцию ceil со ссылкой на страницу руководства Linux

http://man7.org/linux/man-pages/man3/ceil.3.html#DESCRIPTION.

Мой вопрос: возможно ли преобразовать этот макрос в функцию ядра, т.е. в ceil или нет? Кроме того, здесь в коде переменные 'o' и 'rsz' объявлены как unsigned int, где тип возвращаемой функции ceil равен double. Если это возможно, как я могу это изменить?

#define CEIL(a, b)     (((a) + (b-1)) / (b))
o += (((CEIL(rsz, 1024)) << 1) << n);

При редактировании приведенного выше кода в

o += ((ceil(rsz) << 1) << n)

Также я попытался включить математический заголовок в файл .c, который является

# include <math.h>

При выполнении выдает ошибку компиляции

fatal error: math.h: No such file or directory

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Нет, вышеупомянутый макрос нельзя конвертировать в функцию ceil in-kernel, так как в ядре такой функции нет. Хотя, если внимательно посмотреть вышеупомянутый макрос, который является

#define CEIL(a, b)     (((a) + (b-1)) / (b))

Вышеприведенная функция является альтернативой функции ядра DIV_ROUND_UP. Таким образом, можно опустить макрос в ядре и использовать функцию DIV_ROUND_UP в функции вызова.

Это верно, если a и b оба являются целыми числами.

0 голосов
/ 31 марта 2019

Макрос ядра CEIL(a, b) полностью отличается от функции библиотеки ceil() C. Это даже не принимает столько же аргументов!

Кроме того, функции с плавающей точкой (и математика с плавающей точкой в ​​целом) недоступны в ядре. Заголовок <math.h> нельзя использовать в этой среде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...