Comment inclure les mathématiques.h #include <math.h> sur le noyau de fichier source?
Je suis en train d'inclure les mathématiques.h dans mon module du noyau Linux. Si je l'utilise,
#include '/usr/include/math.h'
Il me donner des thèses erreurs:
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
Pourquoi est-ce?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser la bibliothèque C dans un module du noyau, c'est encore plus vrai pour la bibliothèque de mathématiques de la partie.
Vous ne pouvez pas inclure un espace utilisateur module C dans l'espace du noyau. Aussi êtes-vous sûr que vous voulez faire? Ce thread peut aider http://kerneltrap.org/node/16570. Vous pouvez faire des maths fonctions à l'intérieur du noyau, il suffit de chercher partout sur http://lxr.linux.no/ pour la fonction dont vous avez besoin.
Bibliothèques Standard ne sont pas disponibles dans le noyau. Cela comprend la libc, libm, etc. Bien que certaines des fonctions dans les bibliothèques sont mis en œuvre dans l'espace noyau, certains ne le sont pas. Sans savoir ce que vous essayez d'appeler, il est impossible de dire avec certitude si oui ou non vous devez faire ce que vous essayez de faire, dans l'espace du noyau.
Je devrais en outre noter que le noyau n'a PAS accès à la FPU. C'est pour gagner du temps lors de la commutation de tâches (depuis l'enregistrement de la FPU registres d'éviter une surcharge lors de l'exécution de changements de contexte). Vous peut obtenir l'accès à la FPU de l'espace du noyau si vous le voulez vraiment, mais vous devons vraiment être prudent de ne pas la corbeille de l'utilisateur de l'espace de la FPU enregistre quand le faire.
Edit: Cette résume la mise en garde à propos de la FPU beaucoup mieux que je l'ai fait.
D'opérations en virgule flottante n'est pas pris en charge dans le noyau. C'est parce que lors du passage du noyau contexte de contexte de l'utilisateur, les registres doivent être enregistrées. Si le noyau devrait faire usage de la virgule flottante, et puis aussi les registres virgule flottante devrait être sauvés aussi, ce qui serait la cause de la mauvaise performance pour chaque changement de contexte. Parce virgule flottante est très rarement nécessaire, en particulier dans le noyau, il n'est pas pris en charge.
Si vous avez vraiment besoin de:
Autant que je sache, l'espace noyau est séparé de l'espace utilisateur, et donc, si le code source. /usr/include est pour la programmation en général.
Cette suggère que faire de calcul en virgule flottante dans le noyau n'est pas aussi simple dans l'espace utilisateur code. Un autre exemple en suggérant que c'est dur.
Toujours à la recherche pour plus de réponse définitive.
bien vous ne pouvez pas, vous pouvez réécrire les fonctions dont vous avez besoin dans votre module, c'est sale, mais il devrait fonctionner...
Merci beaucoup pour vos commentaires
À utiliser les fonctions mathématiques
Est-il possiable de faire un plan C de l'application et de passer des variables à partir de la source du noyau de fichier. De sorte que le C de l'Application va calculer les variables et renvoie les informations .
Noyau fichier source (l'espace noyau) ---> C d'Application (espace utilisateur)
Noyau fichier source
Donc on peut inclure le fichier d'en-tête dans le code source du noyau. En cas de tout événement, elle transmettre les valeurs d'une application C (espace utilisateur)
Détails:
Je suis en train de modifier mon joystick HID événements(absolue x, y) de Sorte qu'Il ne peut déplacer à l'amélioration de l'emplacement, qui sera genarated par mon application, avec quelques fonctions mathématiques comme (pow, tan,etc).
J'ai donc utilisé hid-entrée.c à recevoir des événements, et de les modifier. qui sera utilisé pour l'entrée du sous-système par le biais de module de noyau hid –
Recherche pour vos commentaires
Ce qui concerne.
Vous ne pouvez pas (souvent, sans beaucoup de noyau de savoir-faire pour verrouiller et de préserver ces registres tout en n'impacte pas les autres sections critiques) utiliser les registres virgule flottante dans le noyau, et d'ailleurs il est bien sûr conseillé à "traitement" dans le noyau. Beaucoup d'autres ont mentionné cette. La Performance sera terrible. Ainsi, les maths.h n'est pas fourni pour les modules du noyau. Nous l'accepter et passer à la suite...
Cependant, comme je suis aussi une victime de fou exigences et complètement fou designs imposée par les autres, c'est une question légitime. Après réduction de l'utilisation des mathématiques.h API afin de minimiser l'impact sur les performances, vous pouvez utiliser l'émulation de virgule flottante (soft-float) par l'intermédiaire de corriger les paramètres du compilateur pour mettre en œuvre vos fonctions sans l'aide de registres virgule flottante. Code du noyau devrait déjà compiler avec ces doux-float paramètres.
Afin de mettre en œuvre
math.h
fonctionnalité, vous pouvez regarder la glibc ou uClibc et peut-être d'autres. Ces deux bibliothèques ont générique "C" des implémentations de libm qui mettent en œuvremath.h
sans utiliser de spécial intrinsèques ou plate-forme de types spécifiques et doivent donc compiler amende dans le noyau.uClibc: Le lien ci-dessus vous emmène directement à la libm section de uClibc.
glibc: Après "git"-ing glibc, vous trouverez ce que vous cherchez dans la glibc/sysdeps/ieee754/flt-32.
glibc peut être plus difficile à comprendre, car il est plus sophistiqué et a plus d'inter-dépendances à l'intérieur de lui-même, mais uClibc fournit uniquement (pour le moment) C89 mathématiques.h. Si vous voulez simple précision (lire: plus rapide) ou mathématiques complexes fonctionnalités que dans C99+, vous aurez à regarder de la glibc.
Peut-être essayer d'utiliser les guillemets doubles (") au lieu de guillemets?
Dans les experts de vue , ce n'est PAS une bonne approche pour la communication des données entre l'espace noyau et l'espace utilisateur. Soit pleinement de travail sur l'espace du noyau OU de l'utilisateur de l'espace.
Mais une solution peut, utiliser read() et write() commande dans un module du noyau pour envoyer de l'information entre l'espace utilisateur et l'espace noyau.