カーネルが最初の構造体ページを格納するユーザースペースの物理メモリにアクセスしようとする単純なプログラムがあります。64ビットマシンでは、このアドレスは次のとおりです。
- カーネル仮想アドレス:ffffea0000000000
- 物理アドレス:00006200000000000
ユーザースペースのmmapを介してこの物理アドレスにアクセスしようとしています。しかし、次のコードはカーネルをクラッシュさせます。
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. */