Comment accéder à mmaped /dev/mem sans se planter le noyau Linux?

J'ai un programme simple qui tente d'accéder à la mémoire physique dans l'espace utilisateur, où le noyau magasins le 1er struct page. Sur un ordinateur 64 bits cette adresse est:

  • virtuelle du noyau adresse: ffffea0000000000
  • adresse physique: 0000620000000000

Je suis en train d'essayer d'accéder à cette adresse physique par le biais de mmap dans l'espace utilisateur. Mais le code suivant planter le noyau.

int *addr;
if ((fd = open("/dev/mem", O_RDWR|O_SYNC)) < 0 ) {
    printf("Error opening file. \n");
    close(fd);
    return (-1);
}
/* mmap.  address of first struct page for 64 bit architectures 
 * is 0x0000620000000000.
 */
addr = (int *)mmap(0, num*STRUCT_PAGE_SIZE, PROT_READ, MAP_PRIVATE,
            fd, 0x0000620000000000);
printf("addr: %p \n",addr);
printf("addr: %d \n",*addr); /* CRASH. */
Quelle est la valeur de mmap() renvoie dans l'adresse?
J'ai essayé ci-dessus sur un 32 bits x86 (en remplacement de mmap compensation de la 0x01000000); addr = 0xffffffff . Et oui, il se bloque, bien sûr, sur le déréférencer. Quelle est la solution?
0xffffffff == -1 -> mmap() retourne une erreur. Selon la page de man, la raison de l'erreur est donnée dans le "errno" variable. De sorte que vous pourriez vouloir vérifier tat.
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?

OriginalL'auteur Vinay | 2012-08-09