2010-12-07 83 views
1

Je dois transférer plusieurs mégaoctets de données par seconde d'un module Linux-noyau à l'espace utilisateur, et je ne veux pas manquer un message du module, si Je lis d'elle. Quel est le meilleur moyen de le faire?Meilleure façon de transférer de grandes données du noyau à l'espace utilisateur

Il y a assez peu de solutions possibles pour ceci: Named-Pipes, Proc-File et un Block-Device Mais je ne suis pas sûr lequel choisir et lequel promet la meilleure performance depuis que je suis un Kernel-Newbie.

Pour l'instant, j'utilise un anneau-tampon (avec spinlocks) dans le module noyau pour stocker les messages et si le fichier Proc est lu, je mets les données du tampon anneau dans le fichier Proc; du côté utilisateur J'ai un programme qui exécute cat /proc/procfile à plusieurs reprises et montre la sortie. Le problème avec cette solution est que, au lieu d'obtenir

MESSAGE 1 MESSAGE 2 MESSAGE 3

sur la sortie, je vois (parfois, une fois tous les quelques milliers de messages)

MESSAGE 1 MESSMESSAGE3

Répondre

1

Il serait toujours possible d'implémenter ce que je considère comme le «syscall du pauvre»: créer un périphérique char, puis créer un ioctl personnalisé avec la sémantique que vous voulez.

Dans ce cas, je suppose que vous auriez un ioctl qui passe dans un tampon d'espace utilisateur, et retourne un morceau de données à partir d'un tampon circulaire que vous détenez dans le noyau. Avec une utilisation judicieuse des variables atomiques et des spinlocks, vous devriez être en mesure de garantir un accès rapide et sécurisé aux données, même si cela est nécessaire sur plusieurs threads.

3

Vous souhaitez probablement utiliser l'interface de relais, anciennement appelée relayfs.

Voir Documentation/filesystems/relay.txt.

De là:

L'interface de relais fournit un moyen pour les applications, le noyau efficacement journal et transférer de grandes quantités de données du noyau vers l'espace utilisateur via définies par l'utilisateur « canaux de relais ».

0

De nombreuses méthodes sont utilisables. Netlink n'en fait cependant pas partie, car ce n'est pas un transport fiable (comme UDP). Un périphérique de caractères semble dans l'ordre, mais vous pouvez également utiliser un socket TCP (voir nfsd).