Mam prosty program, który próbuje uzyskać dostęp do pamięci fizycznej w przestrzeni użytkownika, gdzie jądro przechowuje 1. stronę struktury. Na komputerze 64 bitowym ten adres:Jak uzyskać dostęp do mmaped/dev/mem bez awarii jądra Linux?
- jądro wirtualny adres: ffffea0000000000
- adres fizyczny: 0000620000000000
Próbuję uzyskać dostęp do tego adresu fizycznego poprzez mmap w przestrzeni użytkownika. Ale następujący kod powoduje awarię jądra.
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. */
Jaka jest wartość parametru mmap() w addr? – BjoernD
@BjoernD: Próbowałem powyższego na 32-bitowym x86 (zastępując mmap offset jako 0x01000000); addr = 0xffffffff. I tak, to oczywiście zawiesza się na dereferencji. Jakie jest rozwiązanie? – kaiwan
0xffffffff == -1 -> mmap() zwraca błąd. Zgodnie ze stroną man, przyczyna błędu jest podana w zmiennej "errno". Więc możesz chcieć sprawdzić tat. – BjoernD