Как включить math.h #include ‹math.h› в исходный файл ядра?

Я пытаюсь включить 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

Почему это?


person Madni    schedule 18.06.2009    source источник


Ответы (11)


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

person David Cournapeau    schedule 18.06.2009
comment
Я понимаю, но забавно, что математическая часть более ограничена, чем ограничена. :) - person PeterAllenWebb; 18.06.2009

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

person Sweeney    schedule 18.06.2009

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

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

Изменить: Это резюмирует предупреждение о FPU. лучше, чем я.

person FreeMemory    schedule 18.06.2009

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

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

  • возможно, вы могли бы скомпилировать собственное ядро ​​​​с поддержкой плавающей запятой
  • вы можете заблокировать переключение контекста в ваших операциях с плавающей запятой
  • лучше всего было бы использовать арифметику с фиксированной точкой.
person codymanix    schedule 18.06.2009

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

person Andrei Tanasescu    schedule 18.06.2009
comment
Не будет ли использование метки / означать, что нужно ссылаться на файловую систему? - person samoz; 18.06.2009

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

Все еще ищу более определенный ответ.

person dmckee --- ex-moderator kitten    schedule 18.06.2009

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

person Lopoc    schedule 18.06.2009

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

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

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

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

                                       |

                                   <---|

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

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

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

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

Ищу ваши комментарии

С Уважением.

person Madni    schedule 18.06.2009
comment
Моя первая реакция: не делай этого. Не могли бы вы? Вероятно. Но разрыв между пространством ядра и пространством пользователя существует по чертовски веской причине. Нет никакой гарантии, что к тому времени, когда ядро ​​закончит делать то, что ему нужно, ваше приложение будет работать или даже будет работать. Думаю, нам нужно больше подробностей о том, что вы пытаетесь сделать. Кроме того, не связанно: StackOverflow не является форумом... если вам нужно добавить информацию к своему вопросу, отредактируйте исходный вопрос. - person FreeMemory; 18.06.2009
comment
Разве вы не можете просто внести изменения в свое пользовательское приложение? т.е. если вы получаете событие, которое перемещается в плохое место, вы обнаруживаете его в пользовательском пространстве? - person FreeMemory; 18.06.2009

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

Однако, поскольку я также являюсь жертвой сумасшедших требований и совершенно безумных проектов, навязанных нам другими, это законный вопрос. После сокращения использования API math.h для минимизации влияния на производительность вы можете использовать эмуляцию с плавающей запятой (soft-float) с правильными настройками компилятора для реализации необходимых функций без использования регистров с плавающей запятой. Код ядра уже должен скомпилироваться с этими настройками soft-float.

Чтобы реализовать math.h функциональность, вы можете просмотреть glibc или uClibc и, возможно, другие. Обе эти библиотеки имеют общие "C" реализации libm, которые реализуют math.h без использования специальных встроенных функций или специфичных для платформы типов и поэтому должны прекрасно компилироваться в ядре.

uClibc: приведенная выше ссылка ведет прямо к разделу libm в uClibc.

glibc: После того, как вы напишете glibc с помощью «git», вы найдете то, что ищете, в glibc/sysdeps/ieee754/flt-32.

glibc может быть более сложным для понимания, потому что он более сложен и имеет больше взаимозависимостей внутри себя, но uClibc предоставляет (на данный момент) только C89 math.h. Если вам нужна одинарная точность (читай: быстрее) или сложная математическая функциональность, как в C99+, вам придется взглянуть на glibc.

person Peter M    schedule 08.04.2015

Может быть, попробовать использовать двойные кавычки ("") вместо одинарных?

person samoz    schedule 18.06.2009
comment
Он использует двойные кавычки и ‹ Но все еще с той же проблемой - person Madni; 18.06.2009

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

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

person Madni    schedule 23.06.2009