我想在我的程序中訪問加密的核心存儲卷。 我的計劃是將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
我錯過了什麼?
您是否檢查手冊中的錯誤傳達方式? –
是的,如果出現錯誤,返回值是'MAP_FAILED','errno'被設置爲適當的錯誤常量。所以檢查兩者應該沒問題。在這種情況下,我總是得到'EINVAL'(=無效參數)。 – struct54
不,「檢查任何一個」都不好。 **如果返回**'MAP_FAILED',則**然後**'errno'包含關於錯誤的信息。如果沒有錯誤,通常不會觸及「errno」。 –