2010-02-04 3 views
1

J'ai donc une structure que je veux lire à partir de l'espace utilisateur défini dans l'espace noyau, mais l'espace utilisateur a plusieurs processus.Accéder à une variable dans l'espace noyau à partir de l'espace utilisateur

Exemple:

Dans un module de noyau, j'ai une struct mondiale. struct { int a; int b; } test;

Dans un module de niveau utilisateur, j'ai "externed" que struct global

struct {extern int a; int b; } test;

Le compilateur ne se plaint pas, et l'éditeur de liens ne se plaint pas. Cependant, si l'utilisateur a plusieurs processus, cette structure est-elle clonée pour chaque processus? Si j'utilise la mémoire partagée avec extern, alors je pourrais accéder à la structure du noyau, et si j'ai n processus, alors il n'y a qu'une seule structure depuis son partage. Je peux accéder à une variable au niveau du noyau avec 1 processus au niveau de l'utilisateur, mais si j'ai plus de processus, j'obtiens des clones pour chaque structure qui est "externée"

Ma question est, Est-ce que plusieurs processus au niveau de l'utilisateur peuvent lire un variable au niveau du noyau?

+0

Pouvez-vous poster le code de niveau utilisateur que le compilateur et éditeur de liens ne se plaignent pas? Aussi, le choix du système d'exploitation importe-t-il dans cette question? – ctuffli

Répondre

2

L'espace utilisateur ne peut pas voir le noyau directement dans tous les cas - et mmap'ing/dev/kmem n'est pas une bonne solution non plus (il est vraiment moche à mon avis et ne devrait être utilisé que pour le débogage du noyau).

Je pense que la meilleure façon est de l'exposer soit par un fichier dans/proc (ce qui est assez facile) ou un périphérique de caractères avec un IOCTL (ce qui n'est que légèrement plus compliqué).

(NB: ceci est Linux/Unix spécifiques)

1

Sur la plupart des systèmes d'exploitation, vous ne pouvez pas accéder aux variables d'espace noyau à partir de l'espace utilisateur.
Vous devrez exposer vos données via les mécanismes que votre os fournit. Cela peut être un appel système personnalisé, un fichier exposé via vfs ou toute autre forme d'IPC.

1

Sous Unix, cela se fait généralement par mmap -d'un fichier de périphérique spécial tel que /dev/kmem.

Questions connexes