2016-08-19 262 views
2

我給了一個物理地址,特別是0x000000368d76c0。我正在嘗試將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; 
} 

出於某種原因,當我運行這段代碼我得到mmap失敗。具體來說它說Error Invalid argument。我很確定這是因爲offset的價值,但我不知道它有什麼問題。

我將不勝感激任何幫助。

+0

您是否在'mmap()'的參數中用'adddress'指代'address'? – 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/man-pages/man3/sysconf.3.html) – MikeCAT

回答

3

mmap(2) - Linux manual page

offset必須是頁面大小爲 通過sysconf(_SC_PAGE_SIZE)返回的倍數。

當頁面大小爲4096(x86 CPU中使用的頁面大小)時,0x000000368d76c0不是4096的倍數,將被視爲無效。由於這個原因,你將不得不調整偏移量。