7

Est-il possible de compiler un module linux noyau (2.6) qui inclut des fonctionnalités définies par des inclusions non-kernel?Compiler le module noyau Linux (2.6) incluant les en-têtes non-noyau

Par exemple:


kernelmodule.h

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> // printk() 
// ... 
#include <openssl/sha.h> 
// ... 

Makefile

obj-m := kernelmodule.o 
all: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules 

clean: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean 
    $(RM) Module.markers modules.order 

Le module du noyau je l'ai écrit et tentent de compiler contient des fonctionnalités trouvées dans un certain nombre de o stylosl inclure des fichiers.

Le fichier makefile standard présenté ci-dessus ne permet pas d'inclure à l'extérieur des en-têtes linux. Est-il possible d'inclure cette fonctionnalité, et si oui, pourriez-vous me diriger dans la bonne direction?

Merci, Mike

Répondre

11

Le noyau ne peut pas utiliser le code et doit userspace autonome (à savoir être complètement autonome, pas de bibliothèques), donc il ne capte pas les en-têtes standard.

Il est difficile de déterminer quel avantage tirer des en-têtes d'espace utilisateur. S'il y a des choses à utiliser (constantes, certaines macros à condition qu'elles n'appellent aucune fonction d'espace utilisateur), alors il vaut mieux les dupliquer et n'inclure que les parties compatibles avec le noyau dont vous avez besoin.

Il n'est pas possible de lier le noyau avec des librairies conçues pour l'utilisation de l'espace utilisateur - même si elles ne font aucun appel de système d'exploitation - car l'environnement de liaison du noyau ne peut pas les ramasser.

À la place, recompilez toutes les fonctions à utiliser dans le noyau (en supposant qu'elles n'effectuent aucun appel de système d'exploitation ou de bibliothèque - par exemple malloc - auquel cas elles devront être modifiées de toute façon). Incorporez-les dans votre propre bibliothèque pour les utiliser dans vos modules du noyau.


Les versions récentes de Linux contiennent des fonctions cryptographiques de toute façon, y compris divers SHA tables de hachage - vous pouvez peut-être utiliser l'un de ceux à la place. Une autre idée serait d'arrêter d'essayer de faire du chiffrement dans l'espace noyau et de déplacer le code vers l'espace utilisateur. Le code d'espace utilisateur est plus facile à écrire/déboguer/maintenir etc.

6

J'ai pris des bits du code d'espace utilisateur que j'ai écrit et l'ai converti pour travailler dans l'espace de noyau (ie using kmalloc(), etc.), ce n'est pas si difficile . Cependant, vous êtes limité à la compréhension du noyau par C, et non de l'espace utilisateur, qui diffère légèrement ... en particulier avec divers types int standard. Lier simplement avec l'espace utilisateur Les DSO ne sont pas possibles - le noyau Linux est monolithique, complètement autonome. Il n'utilise pas libc de l'espace utilisateur, bibliothèques ou autres bits comme d'autres l'ont noté.

9/10 fois, vous trouverez ce dont vous avez besoin quelque part dans le noyau.Il est très probable que quelqu'un d'autre a rencontré le même besoin que vous et a écrit des fonctions statiques dans certains modules pour faire ce que vous voulez. Il suffit de les attraper et de les réutiliser.

Dans le cas de crypto, comme d'autres l'ont dit, il suffit d'utiliser ce qui est dans le noyau. Une chose à noter, vous aurez besoin qu'ils soient activés dans kconfig qui peut ou ne peut pas arriver en fonction de ce que l'utilisateur sélectionne lors de la construction. Donc, attention aux dépendances et soyez explicite, vous devrez peut-être pirater quelques entrées dans kconfig qui sélectionnent également l'API crypto que vous voulez quand votre module est sélectionné. Faire cela peut être un peu pénible en construisant un arbre. Donc, d'une part, nous avons "simplement copier et renommer des choses tout en ajoutant du ballonnement", d'autre part, "vous dites aux gens qu'ils doivent avoir la source complète du noyau". C'est l'une des bizarreries qui viennent avec un noyau monolithique. Avec un Microkernel, presque tout fonctionne dans l'espace utilisateur, pas de soucis liés à un DSO pour certains pilotes ... ce n'est pas un problème. S'il vous plaît ne prenez pas cette déclaration comme un signal pour relancer la philosophie de conception du noyau dans les commentaires, ce n'est pas dans la portée de cette question.

Questions connexes