2010-12-14 81 views
1

Mon objectif est d'avoir un tableau ou une liste dans la mémoire du noyau à tout moment, de sorte qu'il soit toujours accessible à partir de l'espace du noyau. Pour ce faire, j'utilise des sockets netlink comme recommandé ici. Je suis this example, qui montre comment envoyer une chaîne. Je ne suis pas sûr de la façon d'envoyer un tableau de struct ou une liste de structures dans les sockets.communication espace-utilisateur noyau-espace avec netlink

typedef struct { 
    int fiveDollarBills; 
    int denDollarBills; 
} Bills; 

Est-il possible d'envoyer une liste ou un tableau en utilisant netlink?

+0

Si tout le reste échoue, vous pouvez sérialiser vos données et envoyer la chaîne – pmg

+0

hmm ... ne pensait pas à cela. Est-ce que C supporte la sérialisation? De plus, si j'envoie la chaîne, est-ce que string.h lib est disponible dans l'espace noyau pour faire des comparaisons de chaînes? – Alkesh

+0

Je ne pense pas, vous avez besoin d'un support spécial de sérialisation, vous pouvez simplement copier le contenu de la structure. Les deux côtés de la socket Netlink fonctionnent toujours sur le même système, donc la disposition binaire est plus ou moins pertinente. – lunaryorn

Répondre

1

NetLink lui-même ne se soucie pas de savoir si les données sont une chaîne, un entier, une structure, etc. Il suffit d'un vide * et d'une longueur et de copier les données sans les regarder. Vous pouvez convertir votre structure en un void * et utiliser sizeof pour déterminer la longueur et envoyer ces données via netlink. De l'autre côté, il suffit d'obtenir le vide * et la longueur, de vérifier que la longueur correspond à ce qu'elle est censée être et de renvoyer le void * à un pointeur vers votre struct. Les deux choses importantes à vérifier sont:

  1. Tant le UserSpace et le code d'accord sur le espace noyau mise en page de la mémoire de la structure. Cela signifie compiler les deux par rapport au même .h et s'assurer que les options de compilation sont telles que la disposition de la mémoire et l'alignement sont les mêmes.

  2. struct sera transféré comme une simple copie de la mémoire brute, theres aucune intelligence pour la fixation des pointeurs, de sorte que votre struct ne peut pas contenir de pointeurs, etc.

L'autre option est plutôt que d'envoyer les données brutes, pour "sérialiser" les données vous-même en les convertissant en, à partir d'une chaîne dans un format connu. Cela vous permettrait de gérer des structures de données plus complexes au détriment des surcharges CPU et mémoire