web-dev-qa-db-fra.com

Comment accéder (si possible) à l'espace noyau depuis l'espace utilisateur?

Dans quelle mesure la mémoire utilisateur et la mémoire des noyaux sont-elles différenciées à l'intérieur du noyau Linux (en termes de sécurité de l'espace du noyau)?

Quelles sont les différentes façons d'écrire dans l'espace d'adressage du noyau à partir de l'espace utilisateur?

Une façon que je connais est par le biais d'un appel système . Nous pouvons utiliser plusieurs appels système, mais à la fin, ce sont tous des appels système. Même dans les appels système, nous envoyons des données à l'espace noyau, où il (pilote ou module respectif) appelle des fonctions comme copy_from_user () pour copier les données de l'espace utilisateur vers l'espace noyau. Ici, nous n'écrivons pas exactement dans l'espace d'adressage. nous passons juste un pointeur utilisateur qui contient les données qui doivent être copiées dans les tampons du noyau.

Ma question est-il possible d'accéder à une adresse physique présente dans l'espace noyau et d'effectuer des opérations dessus?

Deuxièmement, À part les appels système, existe-t-il d'autres moyens d'écrire dans l'espace du noyau à partir d'une application utilisateur?

J'ai fait référence à cela lien de stackoverflow. Mais je pense que ma question n'y trouve pas de réponse et est d'un point de vue différent. J'ai donc pensé à poser une question différente.

Veuillez partager vos connaissances ... Merci.

22
mk..

Quelles sont les différentes façons d'écrire dans l'espace d'adressage du noyau à partir de l'espace utilisateur?

Je ne sais pas s'il existe d'autres méthodes, mais vous pouvez accéder à la mémoire physique en utilisant /dev/mem Et l'appel système mmap().

/dev/mem est un fichier de périphérique de caractères qui est une image de la mémoire principale de l'ordinateur. Il peut être utilisé, par exemple, pour examiner (et même corriger) le système. Les adresses d'octets dans mem sont interprétées comme des adresses de mémoire physique.

plus sur /dev/mem: http://linux.about.com/library/cmd/blcmdl4_mem.htm

plus sur mmap(): http://linux.die.net/man/2/mmap

Vous pouvez utiliser la mmap() pour mapper une section de /dev/mem Et l'utiliser dans votre programme utilisateur. Un bref exemple de code:

#define MAPPED_SIZE //place the size here
#define DDR_RAM_PHYS  //place the physical address here

int _fdmem;
int *map = NULL;
const char memDevice[] = "/dev/mem";

/* open /dev/mem and error checking */
_fdmem = open( memDevice, O_RDWR | O_SYNC );

if (_fdmem < 0){
printf("Failed to open the /dev/mem !\n");
return 0;
}
else{
printf("open /dev/mem successfully !\n");
}

/* mmap() the opened /dev/mem */
map= (int *)(mmap(0,MAPPED_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,_fdmem,DDR_RAM_PHYS));

/* use 'map' pointer to access the mapped area! */
for (i=0,i<100;i++)
printf("content: 0x%x\n",*(map+i));

/* unmap the area & error checking */
if (munmap(map,MAPPED_SIZE)==-1){
perror("Error un-mmapping the file");
}

/* close the character device */
close(_fdmem);

Cependant, assurez-vous que la zone que vous mappez n'est pas utilisée, par exemple par le noyau, ou cela fera planter/bloquer votre système, et vous serez obligé de redémarrer à l'aide du bouton d'alimentation du matériel.

J'espère que ça aide.

23
I'm a frog dragon

Comment la mémoire utilisateur et la mémoire des noyaux sont-elles différenciées au sein du noyau Linux (en termes de sécurité de l'espace du noyau)?

Je ne sais pas si j'ai 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 s'exécute dans le mode CPU le plus privilégié, peut accéder à toute la mémoire.

Quelles sont les différentes façons d'écrire dans l'espace d'adressage du noyau à partir de l'espace utilisateur?

À moins qu'il n'y ait une faille de sécurité dans les pilotes de périphérique du noyau ou du mode noyau, vous ne pouvez pas le faire, du moins pas directement. Le noyau (ou l'un de ses pilotes) peut cependant copier des données de la mémoire de l'application en mode utilisateur vers la mémoire du noyau.

... existe-t-il un moyen d'accéder à une adresse physique présente dans l'espace du noyau et d'effectuer des opérations dessus?

Même chose, vous ne devriez pas pouvoir accéder à la mémoire en utilisant des adresses physiques s'il y a une traduction d'adresse virtuelle en adresse physique. Même le noyau lui-même ne peut pas éviter cette traduction une fois qu'il est activé. Il doit créer des mappages d'adresse virtuelle à physique appropriés dans les tables de pages pour accéder à la mémoire à des adresses physiques arbitraires.

Outre les appels système, existe-t-il d'autres moyens d'écrire dans l'espace noyau à partir d'une application utilisateur?

Vous pouvez également forcer le CPU à basculer vers le code du noyau en déclenchant une exception (par exemple, division par 0, défaut de page, défaut de protection générale, etc.). Le noyau est le premier à gérer les exceptions. Le noyau changera sa mémoire selon les besoins en réponse à une exception. Il peut charger des données de quelque part (par exemple le disque) sur une erreur de page.

4
Alexey Frunze