2014-07-01 107 views
2

我想在我的程序中訪問加密的核心存儲卷。 我的計劃是將mmap解密塊設備輕鬆地跳轉到文件系統結構中,而無需親自處理加密。Mmap Mac OS X上的塊設備?

雖然映射一個大文件的工作就像一個魅力,我正在一個EINVAL錯誤的MMAP系統調用下面的代碼:

#include <stddef.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <sys/mman.h> 

int main(int argc, char *argv[]) 
{ 
    int fd = open("/dev/disk2", O_RDONLY); // this works fine 
    if (fd < 0) 
    { 
    perror("Could not open file"); return(-1); 
    } 

    int pagesize = getpagesize(); // page size is 4096 on my system 
    void* address = mmap(NULL, pagesize, PROT_READ, MAP_SHARED | MAP_FILE, fd, 0); // try to map first page 
    if (address == MAP_FAILED) 
    { 
    perror("Could not mmap"); // Error complaining about an invalid argument 
    } 
} 

該設備具有尺寸112 GB的,我用clang mmap.c -O0 -o mmap編譯在x86_64的Mavericks 10.9.3上。我的系統具有4 GB的RAM和> 10 GB的可用硬盤空間。

該名男子頁的mmap(2)只列出了一個EINVAL錯誤下面的說明,但這些似乎並不適用:

  • MAP_FIXED被指定和地址說法並不頁對齊,或者所需地址空間的一部分駐留在用戶進程的有效地址空間之外。
  • 標誌不包括MAP_PRIVATE或MAP_SHARED。
  • len爭論是否定的。
  • 偏移量參數未根據頁面大小進行頁面對齊,返回值爲getpagesize(3)。

[...]

  • 標誌參數必須指定MAP_PRIVATE或MAP_SHARED。
  • 大小參數必須不能爲0
  • 關閉參數必須是頁面大小的倍數,通過的sysconf()返回。

雖然我還沒有想出了實施的所有細節問題的細節,在此XNU內核源代碼文件中的註釋中明確提及能夠映射塊設備(只要它的共享):https://www.opensource.apple.com/source/xnu/xnu-2422.1.72/bsd/kern/kern_mman.c

我錯過了什麼?

+0

您是否檢查手冊中的錯誤傳達方式? –

+0

是的,如果出現錯誤,返回值是'MAP_FAILED','errno'被設置爲適當的錯誤常量。所以檢查兩者應該沒問題。在這種情況下,我總是得到'EINVAL'(=無效參數)。 – struct54

+0

不,「檢查任何一個」都不好。 **如果返回**'MAP_FAILED',則**然後**'errno'包含關於錯誤的信息。如果沒有錯誤,通常不會觸及「errno」。 –

回答

1

您的問題可能是使用MAP_FILE,因爲這表示常規文件而不是塊設備。

如果這樣不起作用,請在打開文件並檢查文件長度後嘗試調用fstat()。當我使用stat -x獲取有關係統上塊設備的信息時,文件大小將報告爲零(ls -l報告大小爲「1」)。零長度文件也可能會阻止您創建映射。