Как включить math.h #include <math.h> в исходный файл ядра? - PullRequest
5 голосов
/ 18 июня 2009

Я пытаюсь включить math.h в мой модуль ядра Linux. Если я использую,

#include '/usr/include/math.h'

Это дает мне ошибки тезисов:

error: features.h: No such file or directory
error: bits/huge_val.h: No such file or directory
error: bits/mathdef.h: No such file or directory
error: bits/mathcalls.h: No such file or directory

Почему это?

Ответы [ 11 ]

9 голосов
/ 18 июня 2009

Вы не можете использовать библиотеку C в модуле ядра, это еще более верно для математической части библиотеки.

4 голосов
/ 18 июня 2009

Стандартные библиотеки не доступны в ядре. Это включает libc, libm и т. Д. Хотя некоторые функции в этих библиотеках реализованы в пространстве ядра, некоторые - нет. Не зная, что вы пытаетесь назвать, невозможно точно сказать, следует ли вам делать то, что вы пытаетесь делать в пространстве ядра.

Следует также отметить, что ядро ​​НЕ имеет доступа к FPU. Это позволяет сэкономить время при переключении задач (поскольку сохранение регистров FPU добавит ненужные издержки при выполнении переключений контекста). Вы можете получить доступ к FPU из пространства ядра, если вы действительно этого хотите, но вам нужно быть очень осторожным, чтобы не уничтожить регистры FPU пользовательского пространства при этом. Редактировать: Этот обобщает предостережение о FPU намного лучше, чем я.

4 голосов
/ 18 июня 2009

Вы не можете включить модуль C пользовательского пространства в пространство ядра. Также вы уверены, что хотите этим заниматься? Эта ветка может помочь http://kerneltrap.org/node/16570. Вы можете выполнять математические функции внутри ядра, просто ищите на http://lxr.linux.no/ нужную вам функцию

2 голосов
/ 19 июня 2009

Операции с плавающей запятой не поддерживаются в ядре. Это связано с тем, что при переключении из контекста ядра в контекст пользователя регистры должны быть сохранены. Если бы ядро ​​использовало число с плавающей запятой, то также необходимо было бы также сохранить регистры с плавающей запятой, что могло бы привести к плохой производительности для каждого переключения контекста. Так как плавающая точка очень редко нужна, особенно в ядре, она не поддерживается.

Если вам действительно нужно:

  • возможно, вы могли бы собрать свое собственное ядро ​​с поддержкой плавающей запятой
  • вы можете заблокировать переключение контекста в операциях с плавающей запятой
  • Лучше всего использовать арифметику с фиксированной точкой.
1 голос
/ 18 июня 2009

Это предполагает, что математика с плавающей запятой в ядре не так проста, как в коде пользовательского пространства. Другой экземпляр , предполагающий, что это сложно.

Все еще ищу более точный ответ.

1 голос
/ 18 июня 2009

Пространство ядра AFAIK отделено от пространства пользователя, как и исходный код. / usr / include для общего программирования.

0 голосов
/ 08 апреля 2015

Вы не можете (часто без большого количества ноу-хау ядра блокировать и сохранять эти регистры, не затрагивая другие критические секции) использовать регистры с плавающей запятой в ядре, и, кроме того, конечно, неуместно выполнять «обработку» в ядро. Многие другие упоминали об этом. Производительность будет ужасной. Таким образом, 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.

0 голосов
/ 23 июня 2009

По мнению экспертов, это НЕ хороший подход для обмена данными между пространством ядра и пространством пользователя. Либо полностью работайте в пространстве ядра, либо только в пространстве пользователя.

Но одно решение может использовать команду read () и write () в модуле ядра для отправки информации между пространством пользователя и пространством ядра.

0 голосов
/ 18 июня 2009

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

0 голосов
/ 18 июня 2009

Большое спасибо за ваши комментарии

Для использования математических функций

Возможно ли создать приложение на плоскости C и передать переменные из исходного файла ядра. Таким образом, Приложение C вычислит переменные и отправит обратно информацию.

Исходный файл ядра (пространство ядра) ---> C Приложение (пространство пользователя)

                                       |

                                   <---|

Исходный файл ядра

Так что мы можем включить заголовочный файл в исходный код ядра. В случае какого-либо события он передает значения в приложение C (пространство пользователя)

подробности: Я пытаюсь изменить события HID-джойстика (абсолютные x, y), поэтому он может перемещаться только в улучшенное местоположение, которое будет генерироваться моим приложением, с некоторыми математическими функциями, такими как (pow, tan и т. Д.).

Поэтому я использовал hid-input.c для получения необработанных событий и их изменения. которая будет использоваться для подсистемы ввода через модуль ядра hid -

Ваши комментарии

Привет.

...