Comment accéder(si possible) l'espace du noyau à partir de l'espace utilisateur?
Comment exactement est la mémoire utilisateur et les grains de la mémoire différenciés à l'intérieur du noyau Linux(en termes de donner de la sécurité à l'espace noyau)?
Quelles sont les différentes façons je peux écrire dans l'espace d'adressage du noyau à partir de l'espace utilisateur?
D'une façon que je sais c'est par le biais d'un système d'appel. Il y a plusieurs appels système, nous pouvons utiliser, mais à la fin ils sont tous les appels système. Même dans les appels système, nous envoyer des données à l'espace du noyau, où il(pilote ou module) fait appel à des fonctions comme copy_from_user() pour copier les données à partir de l'espace utilisateur espace noyau vers l'espace. Ici, nous avons exactement ne sont pas de l'écriture dans l'espace d'adresse. nous sommes juste de passage d'un utilisateur pointeur qui contient les données qui doivent être copiés dans le noyau des tampons.
Ma question est-il de toute façon on peut accéder à une adresse physique qui est présent dans l'espace du noyau et effectuer des opérations sur elle?
Deuxième, Hormis les appels système sont-il d'autres façons d'écrire dans l'espace du noyau d'une application utilisateur?
J'ai évoqué ce lien de stackoverflow. Mais je pense que ma question n'est pas répondue, il est à partir de différents point de vue. J'ai donc pensé à poser une autre question.
S'il vous plaît partagez vos connaissances...
Merci.
- D'abord apprendre comment x86 pagination fonctionne: stackoverflow.com/questions/18431261/how-does-x86-paging-work , cela aidera.
- Voir aussi Comment accéder à mmaped /dev/mem sans se planter le noyau Linux?, mmap de /dev/mem échoue avec un argument non valide, mais l'adresse est alignée sur et Comment accéder à l'espace du noyau à partir de l'espace utilisateur?
- Vous voudrez peut-être lire à propos de vDSO.
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas si il y a d'autres méthodes, mais vous pouvez accéder à la mémoire physique à l'aide de
/dev/mem
& appel systèmemmap()
.plus sur
/dev/mem
: http://linux.about.com/library/cmd/blcmdl4_mem.htmplus sur
mmap()
: http://linux.die.net/man/2/mmapVous pouvez utiliser le
mmap()
à la carte une section de/dev/mem
et à utiliser dans votre programme utilisateur. Un bref exemple de code:Cependant, assurez-vous que la zone que vous cartographie n'est pas utilisé, par exemple par le noyau, ou il fera de votre système d'arrêt/de blocage, et vous serez obligé de redémarrer à l'aide de bouton d'alimentation du matériel.
Espère que cela aide.
Ne sais pas si j'ai bien compris votre question.
Pour le noyau, il n'y a pas beaucoup de différence techniquement, c'est juste de la mémoire. Pourquoi? Parce que le noyau, qui est en cours d'exécution dans les plus privilégiés mode CPU, peut accéder à toute la mémoire.
Moins qu'il y a un trou de sécurité dans le noyau ou kernel pilotes de périphériques en mode, vous ne pouvez pas le faire, du moins pas directement. Le noyau (ou l'un de ses pilotes) peuvent, toutefois, copier les données de l'utilisateur de l'application en mode mémoire à la mémoire du noyau.
Même chose, vous ne devriez pas être en mesure d'accéder à la mémoire en utilisant des adresses physiques si il y a virtuelle et adresse physique de traduction présents. Même le noyau lui-même ne peut pas éviter cette traduction une fois qu'il est activé. Il a pour créer virtuel approprié à la physique des mappages d'adresses dans les tables de page pour accéder à la mémoire à l'arbitraire des adresses physiques.
Vous pouvez également forcer le CPU pour passer le code du noyau par le déclenchement d'une exception (par exemple la division par 0, page de faute, erreur de protection générale, etc). Le noyau est le premier à traiter les exceptions. Le noyau va changer son mémoire en réponse à une exception. Il peut charger des données à partir de quelque part (par exemple, disque) sur un défaut de page.