2012-04-10 124 views
5

我無法獲得mmap函數的工作。它返回EINVAL錯誤代碼。mmap()返回EINVAL

void* mapped = 
     mmap((void*)(map_addr + slide), 
      map_size, 
      PROT_WRITE | PROT_READ, 
      MAP_PRIVATE | MAP_ANON, 
      bprm->file, 
      map_offset); 

我檢查的文件對我的平臺(達爾文)這個功能似乎沒有被任何事。 mmap的手冊頁提供了EINVAL將返回的四種情況。

[EINVAL]   MAP_FIXED was specified and the addr argument was not page 
        aligned, or part of the desired address space resides out of the 
        valid address space for a user process. 

MAP_FIXED未指定,所以不是這樣。

[EINVAL]   flags does not include either MAP_PRIVATE or MAP_SHARED. 

MAP_PRIVATE存在。

[EINVAL]   The len argument was negative. 

中的LEN(map_size)在呼叫的時間參數是8192

[EINVAL]   The offset argument was not page-aligned based on the page size as 
        returned by getpagesize(3). 

offset參數(map_offset)爲0,因此它必須是頁對齊。 (也許我錯了?)

+1

使用MAP_ANON,某些實現需要fd爲-1。可能值得檢查。 – 2012-04-10 12:48:05

+0

** @ Simon Elliott **是的,你是對的。謝謝。 – 2012-04-10 12:51:05

回答

2

您確定要閱讀第一個描述嗎?它也可以被理解爲描述兩個不相交的情況:一個用戶進程

  1. MAP_FIXED被指定和addr參數不對齊的頁面,
  2. 或所需的地址空間的一部分駐留在有效地址空間。

如果像這樣讀取,map_addr + slide表達式的實際值變得有趣。

0

我會建議使用NULLaddr論證,並給予實施完全自由放置你的mmaped區域(因爲你指定的地址可能相對於該進程的地址空間走歪),直到有一個嚴重的理由不否則。

+0

作爲一個測試,我嘗試過使用'NULL'。仍然返回'EINVAL'。 – 2012-04-10 12:48:56

+0

@NickBrooks你可以在你的系統上測試PAGE_SIZE嗎? – 2012-04-10 13:14:31