Pour autant que je sache, le code en mode noyau peut accéder à n'importe quelle adresse disponible (privilège élevé), mais si je passe un pointeur en mode utilisateur à une fonction en mode noyau, sera-t-il modifié avant de l'utiliser ? Je veux dire : sera-t-il résolu avec les systèmes de pagination/segmentation (ou juste la pagination pour le mode long) comme il le serait en mode utilisateur ?
Réponse
Trop de publicités?Tout d'abord, vous ne pouvez pas "fournir un pointeur vers une fonction en mode noyau". Les appels du noyau ne sont pas de simples sauts, ce sont des instructions spéciales ou des interruptions logicielles. Les conventions d'appel de fonction du noyau sont également différentes de vos appels de fonction habituels.
Quoi qu'il en soit, le fonctionnement exact de l'accès à la mémoire utilisateur depuis un contexte noyau dépend du système d'exploitation en question. Le noyau possède généralement un espace d'adressage (virtuel) qui lui est propre. Il peut s'agir d'un espace d'adressage complètement indépendant des espaces de processus utilisateur (par exemple, OSX 32 bits) ou il peut se trouver dans une région spéciale (la division d'adresse haute/basse dans de nombreux systèmes d'exploitation). Dans le modèle haut/bas, le noyau peut généralement déréférencer les pointeurs vers l'espace utilisateur. pendant qu'il s'exécute dans le contexte de ce processus. . Dans le cas général, le noyau peut rechercher explicitement la mémoire physique sous-jacente à laquelle l'adresse virtuelle de l'utilisateur fait référence, puis la mapper dans son propre espace d'adressage virtuel.
Comme l'espace utilisateur peut malicieusement fournir de mauvais pointeurs, ils ne doivent jamais être utilisés par le noyau sans vérification préalable de leur validité. Cette vérification et l'accès ultérieur doivent être atomiques par rapport à la carte mémoire du processus utilisateur, sinon le processus pourrait munmap()
l'intervalle de temps entre la vérification de la validité du pointeur par le noyau et la lecture/écriture effective de la mémoire. C'est pour cette raison que la plupart des noyaux ont des fonctions d'aide qui sont essentiellement des fonctions de sécurité. memcpy
entre l'espace utilisateur et l'espace noyau qui est garantie d'être sûre ou de retourner une erreur dans le cas d'un pointeur invalide.
Dans tous les cas, le code du noyau doit faire tout cela explicitement, il n'y a rien d'"automatique" là-dedans. Votre syscall peut passer par des couches d'abstraction qui automatisent cela avant d'atteindre votre module noyau, bien sûr.
Mise à jour : Le matériel moderne prend en charge SMAP (supervisor mode access prevention), qui est conçu pour empêcher le déréférencement accidentel/malveillant de pointeurs vers l'espace d'adressage utilisateur à partir du noyau. Divers systèmes d'exploitation ont commencé à activer cette fonctionnalité, de sorte que dans ces cas, vous devez absolument passer par les fonctions spéciales du noyau pour accéder à la mémoire utilisateur.