Stockage de struct array dans l’espace kernel, Linux

Je pense que je pense peut-être un peu trop à ce problème … J’ai un fichier texte situé sur mon système de fichiers que je suis en train d’parsingr au démarrage et de stocker les résultats dans un tableau de structures. J’ai besoin de copier ce tableau de l’espace utilisateur dans l’espace du kernel (copy_from_user), et le kernel doit pouvoir accéder à ces données à tout moment. Le fichier Sockets.c devra accéder aux données de l’espace kernel. Existe-t-il un emplacement spécial pour stocker un tableau dans l’espace kernel ou puis-je simplement append une référence au tableau dans Sockets.c? Mon C est un peu rouillé …

Merci pour tout conseil.

Je crois qu’il y a deux parties principales dans votre problème:

  • Passer les données de l’espace utilisateur à l’espace kernel

  • Stocker les données dans l’espace kernel

Pour le premier numéro, je suggérerais d’utiliser une socket Netlink, plutôt que l’interface plus traditionnelle d’appel système (lecture / écriture / ioctl). Les sockets Netlink permettent aux données de configuration d’être transmises au kernel à l’aide d’une interface de type socket, qui est considérablement plus simple et plus sûre à utiliser.

Votre programme doit effectuer toutes les parsings et la validation des entrées, puis transmettre les données au kernel, de préférence sous une forme plus structurée (par exemple, entrée par entrée) qu’un blob de données volumineux.

Si vous n’êtes pas intéressé par un débit élevé (mégaoctets de données par seconde), l’interface netlink convient parfaitement. Les liens suivants fournissent une explication, ainsi qu’un exemple:

http://en.wikipedia.org/wiki/Netlink

http://www.linuxjournal.com/article/7356

http://linux-net.osdl.org/index.php/Generic_Netlink_HOWTO

http://www.kernel.org/doc/Documentation/connector/

En ce qui concerne le stockage de la masortingce, si vous envisagez de stocker plus de 128 Ko de données, vous devrez utiliser vmalloc () pour allouer l’espace, sinon kmalloc () est préférable. Vous devriez lire le chapitre correspondant du livre Linux Device Drivers:

http://lwn.net/images/pdf/LDD3/ch08.pdf

Veuillez noter que les tampons alloués avec vmalloc () ne conviennent pas aux DMA vers / depuis les périphériques, car les pages de mémoire ne sont pas contiguës Vous pouvez également envisager une structure de données plus complexe, telle qu’une liste, si vous ne connaissez pas le nombre d’entrées que vous aurez auparavant.

En ce qui concerne l’access au stockage dans le monde entier, vous pouvez le faire comme avec n’importe quel programme C:

Dans un fichier d’en-tête inclus par tous les fichiers .c dont vous avez besoin pour accéder aux données, mettez quelque chose comme:

extern struct my_struct *unique_name_that_will_not_conflict_with_other_symbols; 

Le mot-clé extern indique qu’il déclare une variable implémentée dans un autre fichier source. Cela rendra ce pointeur accessible à tous les fichiers C contenant cet en-tête. Puis dans un fichier C, préférablement celui qui contient le rest de votre code – s’il en existe un:

 struct my_struct *unique_name_that_will_not_conflict_with_other_symbols = NULL; 

Quelle est l’implémentation réelle de la variable déclarée dans le fichier d’en-tête.

PS: Si vous voulez travailler avec le kernel Linux, vous devez vraiment rafraîchir votre C. Sinon, vous passerez des moments très frustrants et vous vous retrouverez désolé et endolori.

PS2: Vous gagnerez également beaucoup de temps si vous parcourez au moins tout le livre Pilotes de périphérique Linux. Malgré son nom et son âge relatif, il contient de nombreuses informations actuelles et importantes pour l’écriture de tout code pour le kernel Linux.

Vous pouvez simplement définir un pointeur extern quelque part dans le kernel (par exemple, dans le fichier sockets.c où vous allez l’utiliser). Initialisez-le sur NULL et incluez une déclaration dans un fichier d’en-tête approprié.

Dans la partie du code qui copy_from_user() , copy_from_user() espace pour le tableau à l’aide de kmalloc() et stockez l’adresse dans le pointeur. Copiez les données dedans. Vous voudrez également qu’un mutex soit verrouillé autour de l’access au tableau.

La mémoire allouée par kmalloc() persistera jusqu’à ce qu’elle soit libérée avec kfree() .

Votre question est de base et suffisamment vague pour que je vous recommande de travailler sur certains des exercices de ce livre . L’ensemble du chapitre 8 est consacré à l’allocation de la mémoire du kernel.