私はユーザー空間でmmapを使用して、 'mem_map'が開始する物理メモリを読み取ろうとしています。すべての物理ページを含む配列です。これは、3.0カーネルを実行しているi386マシンです。mmap:操作が許可されていません
コードは次のようである:
....
//define page size
//
#define PAGE_SIZE 0x1000 //4096 bytes
#define PAGE_MASK (PAGE_SIZE - 1)
....
/* open /dev/mem file*/
if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) {
printf("/dev/mem could not be opened.\n");
perror("open");
exit(1);
} else {
printf("/dev/mem opened.\n");
}
/* Map one page */
printf(" mem_map is at physical addr: 0x%x\n", mem_map_phy_addr);
map_base = mmap(0, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, (mem_map_phy_addr & ~PAGE_MASK)); //mem_map_phy_addr is at 0x356f2000
if(map_base == (void *) -1) {
printf("Memory map failed. err num = %d\n",errno);
perror("mmap"); //failed here
} else {
printf("Memory mapped at address %p.\n", map_base);
}
私はrootとしてこれを実行しました。出力は次のとおりです。
/dev/mem opened.
mem_map is at physical addr: 0x356f2000
Memory map failed. err num = 1
mmap: Operation not permitted
確かに、私はこの問題をGoogleで検索し、私の/etc/sysctl.confファイルに次の行を追加しました:
vm.mmap_min_addr = 0
しかし、これはどちらか動作しません。
誰かが、このようなmem_mapの操作が許可されていない理由とその回避方法を知っていますか?
ありがとうございました。
、 'X&〜PAGE_MASK'を使用することが間違っています。 64ビットシステムでは、アドレスが32ビットに切り詰められます。補完を取る前に、 'uintptr_t'または同等のワイドタイプにキャストする必要があります。 –
sysctlコマンドを実行してmmap_min_addrの値を設定するか、confファイルを編集しましたか?あなたは両方をする必要があります。 –
はい、後で "sysctl -p"を実行しました。 – user899159