Вы не можете (часто без большого количества ноу-хау ядра блокировать и сохранять эти регистры, не затрагивая другие критические секции) использовать регистры с плавающей запятой в ядре, и, кроме того, конечно, неуместно выполнять «обработку» в ядро. Многие другие упоминали об этом. Производительность будет ужасной. Таким образом, math.h не предусмотрен для модулей ядра. Мы принимаем это и идем дальше ...
Однако , поскольку я также являюсь жертвой сумасшедших требований и совершенно безумных замыслов, навязанных нам другими, это законный вопрос. После сокращения использования API math.h для минимизации влияния на производительность вы можете использовать эмуляцию с плавающей запятой (soft-float) через правильные настройки компилятора для реализации необходимых функций без использования регистров с плавающей запятой. Код ядра уже должен компилироваться с этими настройками софт-плавающего числа.
Чтобы реализовать функциональность math.h
, вы можете посмотреть glibc или uClibc и, возможно, другие. Обе эти библиотеки имеют общие реализации libm на «C», которые реализуют math.h
без использования специальных встроенных функций или специфических для платформы типов и поэтому должны прекрасно компилироваться в ядре.
uClibc: Приведенная выше ссылка ведет вас непосредственно к разделу libm uClibc.
glibc: после git-glibc вы найдете то, что ищете, в glibc / sysdeps / ieee754 / flt-32.
glibc может быть сложнее понять, потому что он более сложный и имеет больше взаимозависимостей внутри себя, но uClibc предоставляет только (в настоящий момент) C89 math.h. Если вам нужна одинарная точность (читай: быстрее) или сложные математические функции, как в C99 +, вам придется взглянуть на glibc.