사용자 공간에서 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);
}
내가 루트로이 달렸다. 출력은 다음과 같습니다
/dev/mem opened.
mem_map is at physical addr: 0x356f2000
Memory map failed. err num = 1
mmap: Operation not permitted
은 확실히, 내가 문제를 봤 내으로 /etc/sysctl.conf 파일에 다음 줄을 추가 :
vm.mmap_min_addr = 0
을하지만이 중 하나가 작동하지 않습니다.
누구나 이런 mem_map 작업이 허용되지 않는 이유와 그 문제를 해결할 수있는 방법을 알고 있습니다.
감사합니다.
,'X & ~ PAGE_MASK'를 사용하는 것이 올바르지 않습니다. 64 비트 시스템에서는 32 비트로 주소가 잘립니다. 보완하기 전에 'uintptr_t'또는 이와 동등한 와이드 타입으로 형변환해야합니다. –
mmap_min_addr에 대한 값을 설정하거나 conf 파일을 편집하기 위해 sysctl 명령을 실행 했습니까? 둘 다해야 해. –
예, 나중에 "sysctl -p"를 수행했습니다. – user899159