GNU/Linux >> Tutoriels Linux >  >> Linux

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

Quelles sont les différentes manières dont je peux é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 &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.

en savoir 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 le 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, sinon votre système plantera/se bloquera et vous serez obligé de redémarrer à l'aide du bouton d'alimentation matériel.

J'espère que ça aide.


Comment la mémoire utilisateur et la mémoire du noyau sont-elles exactement différenciées à l'intérieur 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 manières dont je peux é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 le noyau ou les pilotes de périphérique en 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'y effectuer des opérations ?

Même chose, vous ne devriez pas pouvoir accéder à la mémoire à l'aide d'adresses physiques s'il existe une traduction d'adresse virtuelle à 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'adresses virtuelles à physiques 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 du noyau à partir d'une application utilisateur ?

Vous pouvez également forcer le CPU à passer au 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 modifiera sa mémoire selon les besoins en réponse à une exception. Il peut charger des données depuis quelque part (par exemple, un disque) sur une erreur de page.


Linux
  1. Linux - Différence entre l'espace utilisateur et l'espace noyau ?

  2. Comment créer un nouvel utilisateur avec un accès Ssh ?

  3. Comment accéder à phpMyAdmin depuis cPanel

  4. Comment accéder aux adresses physiques depuis l'espace utilisateur sous Linux ?

  5. pile du noyau et pile de l'espace utilisateur

Comment construire le noyau Linux à partir de zéro {Guide étape par étape}

Comment ajouter ou supprimer un utilisateur d'un groupe sous Linux

Comment accéder aux partitions Linux à partir de Windows 10

Comment construire le noyau Linux à partir de zéro

Comment supprimer Swap Space de Centos 7.x ?

Comment obtenir le nom de l'utilisateur à partir de l'uid