Frage

Ich versuche math.h in meinem Linux-Kernel-Modul enthalten. Wenn ich,

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

Es gibt mir Thesen Fehler:

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

Warum ist das?

War es hilfreich?

Lösung 11

Experten sehen, es ist nicht ein guter Ansatz, um Daten zwischen der Kernel und Userspace zu kommunizieren. Entweder vollständig auf Kernel-Space arbeiten oder nur auf Benutzerraum.

Aber eine Lösung kann mit read () und write () Befehl in einem Kernel-Modul die Informationen zwischen User-Space und Kernel-Space zu senden.

Andere Tipps

Sie nicht die C-Bibliothek in einem Kernel-Modul verwenden können, dies gilt umso mehr für den Mathematik-Bibliothek Teil.

Sie können keine User-Space C-Modul in den Kernel enthalten. Auch sind Sie sicher, dass Sie dies tun wollen? Dieser Thread kann helfen http://kerneltrap.org/node/16570 . Sie können innerhalb des Kernels mathematischen Funktionen tun, nur um die Suche auf http://lxr.linux.no/ für die Funktion benötigen Sie.

Standardbibliotheken sind im Kernel nicht verfügbar. Dazu gehören libc, libm usw. Obwohl einige der Funktionen in diesen Bibliotheken sind in den Kernel implementiert, manche nicht. Ohne zu wissen, was Sie zu nennen sind versuchen, ist es unmöglich, mit Sicherheit zu sagen, ob oder nicht, sollten Sie tun, was Sie versuchen, in dem Kernel zu tun.

Ich sollte weiter beachten Sie, dass der Kernel keinen Zugriff auf die FPU hat. Dies ist die Zeit zu sparen, wenn Aufgaben Schalten (da die FPU Register Einsparung würde unnötigen Aufwand hinzufügen, wenn Kontext Durchführung Schalter). Sie können erhalten Sie Zugriff auf die FPU vom Kernel-Space, wenn Sie es wirklich wollen, aber Sie müssen wirklich vorsichtig sein, nicht den Benutzerraum des FPU-Register in den Papierkorb, wenn dies zu tun.

Edit: Diese den Vorbehalt fasst über die FPU viel besser als ich.

Gleitkommaoperationen ist nicht im Kernel unterstützt werden. Dies liegt daran, wenn aus dem Kernel-Kontext Benutzerkontext Umschalten Register gespeichert werden müssen. Wenn die Kernel Verwendung von Floating-Point machen würde, dann auch das Floating-Point-Register würde auch gespeichert werden muß, die schlechte Leistung für jeden Kontextwechsel führen würde. Also, da Punkt schwimmt sehr selten benötigt, vor allem in dem Kernel wird nicht unterstützt.

Wenn Sie wirklich müssen:

  • vielleicht könnten Sie Ihren eigenen Kernel mit Floating-Point-Unterstützung
  • kompilieren
  • Sie könnten Kontextwechsel innerhalb Ihrer Gleitkommaoperationen blockieren
  • wäre die beste Fixpunkt arithmetics zu verwenden.

AFAIK Kernraum ist vom Benutzerraum getrennt, und so sollte der Quellcode. / Usr / include ist für die allgemeine Programmierung.

Dies legt nahe, dass tun Gleitkommamathematik in der Kernel ist nicht so einfach ist, in dem User-space-Code. Ein weiteres Beispiel darauf hindeutet, dass dies schwierig ist.

Noch auf der Suche für eine definitive Antwort.

gut Sie sich nicht, Sie Funktionen neu schreiben können Sie in Ihrem Modul benötigen, ist es schmutzig, aber es sollte funktionieren ...

Vielen Dank für Ihre Kommentare

Um mathematische Funktionen verwenden

Ist es possiable eine Ebene C-Anwendung zu machen und Variablen aus dem Kernel-Quelldatei übergeben. So ist die C Anwendung wird die Variablen berechnen und die Informationen zurückschickt.

Kernel-Quelldatei (Kernel-Space) ---> C Anwendung (Benutzerraum)

                                       |

                                   <---|

Kernel-Quelldatei

So können wir Header-Datei im Kernel-Quellcode enthalten. Im Falle einer jeden Fall die Werte an eine C-Anwendung übergeben (Benutzerraum)

Details: Ich versuche, meine HID Joystick Ereignisse (absolute x, y) Es kann also nur auf die verbesserte Position verschieben zu ändern, die durch meine Anwendung genarated wird, mit einigen mathematischen Funktionen wie (pow, tan, etc).

So habe ich hid-input.c Rohereignisse zu bekommen, und sie ändern. die für die Eingabe-Subsystem durch verstecktes Kernel-Modul verwendet wird -

Suchen Sie für Ihre Kommentare

Viele Grüße.

Sie können nicht (oft, ohne viele Kernel-Know-how, diese Register zu sperren und zu bewahren, während nicht andere kritische Abschnitte zu beeinflussen)-Point-Register im Kernel verwenden schwimmen, und außerdem ist es ungeeignet ist natürlich „Verarbeitung“ in der zu tun Kernel. Viele andere haben dies erwähnt. Die Leistung wird schrecklich sein. Somit wird math.h nicht für Kernel-Module zur Verfügung gestellt. Wir nehmen diese und ziehen weiter ...

Jedoch , wie ich auch ein Opfer von verrückten Anforderungen bin und völlig verrückt auf uns von anderen gezwungen Design, das ist eine berechtigte Frage. Nach der Verringerung der Verwendung der math.h API, um die Auswirkungen auf die Leistung zu minimieren, können Sie Floating-Point-Emulation (Soft-float) über richtige Compiler-Einstellungen verwenden, um Ihre erforderlichen Funktionen ohne Verwendung Gleitkommaregister zu implementieren. Kernel-Code sollte bereits kompilieren mit diesen Soft-Float-Einstellungen.

Um math.h Funktionalität zu implementieren, können Sie sich unter glibc oder uClibc und vielleicht andere. Beiden Bibliotheken haben generische „C“ Implementierungen von libm die math.h ohne den Einsatz speziell intrinsics oder plattformspezifische Typen implementieren und soll daher kompilieren ganz gut in dem Kernel.

uClibc. Der obige Link führt Sie direkt auf den libm Abschnitt von uClibc

glibc. Nach "git" glibc -ing, finden Sie, was Sie suchen in glibc / sysdeps / IEEE754 / FLT-32

glibc kann schwieriger sein, zu verstehen, weil es anspruchsvoller ist und mehr gegenseitigen Abhängigkeiten in sich selbst, sondern uClibc bietet nur (im Moment) C89 Datei math.h. Wenn Sie mit einfacher Genauigkeit (sprich: schneller) wollen. Oder komplexe mathematische Funktionen wie in C99 +, müssen Sie bei glibc aussehen

Vielleicht doppelte Anführungszeichen versuchen Sie es mit ( ") anstelle von einfachen Anführungszeichen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top