2016-08-19 6 views
2

실제 주소가 부여되었습니다. 구체적으로는 0x000000368d76c0입니다. 나는 내 프로그램에 mmap하려고하고있다. 내가 mmap에 실패를 얻을이 코드를 실행하면 내가 사용하는 코드는 어떤 이유로mmap이 실패하는 이유는 무엇입니까?

void *mmap64; 
off_t offset = 0x000000368d76c0; 
int memFd = open("/dev/mem", O_RDWR); 
if (-1 == memFd) 
    perror("Error "); 

mmap64 = mmap(0, sizeof(uint64_t), PROT_WRITE | PROT_READ, MAP_SHARED, memFd, offset); 
if (MAP_FAILED == mmap64) { 
    perror("Error "); 
    return -1; 
} 

입니다. 특히 Error Invalid argument라고합니다. 나는 그것이 offset 값이기 때문에 그것이라고 확신하지만, 나는 그것이 무엇이 잘못되었는지 모른다.

감사합니다. mmap(2) - Linux manual page에 따르면

+0

'mmap()'의 인수에서'adddress'에 의해'주소'를 의미합니까? – MikeCAT

+0

@MikeCAT 나는 'offset' 인수를 의미합니다. – flashburn

+7

[mmap (2) - Linux 매뉴얼 페이지] (http://man7.org/linux/man-pages/man2/mmap.2.html)는 "offset"은 다음과 같이 반환 된 페이지 크기의 배수 여야합니다. 'sysconf (_SC_PAGE_SIZE)' ". 시스템의 가치는 무엇입니까? 참고 : [sysconf (3) - Linux 매뉴얼 페이지] (http://man7.org/linux/manage/man3/sysconf.3.html) – MikeCAT

답변

3

,

offset

sysconf(_SC_PAGE_SIZE)에 의해 반환 같은 페이지 크기의 배수 여야합니다.

페이지 크기가 4096 (x86 CPU에서 사용되는 페이지 크기) 인 경우 0x000000368d76c0은 4096의 배수가 아니며 유효하지 않은 것으로 간주됩니다.

그런 이유로 오프셋을 조정해야합니다.

관련 문제