gpt4 book ai didi

c - 在 Mac OS X 上映射一个 block 设备?

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:24 24 4
gpt4 key购买 nike

我想在我的程序中访问一个加密的核心存储卷。我的计划是映射解密 block 设备,以便能够轻松地在文件系统结构中跳转,而无需自己处理加密。

虽然映射大文件非常有效,但我在以下代码中的 mmap 系统调用中收到 EINVAL 错误:

#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,我正在为 x86_64 的 Mavericks 10.9.3 使用 clang mmap.c -O0 -o mmap 进行编译。我的系统有 4 GB 的 RAM 和 > 10 GB 的可用硬盘空间。

手册页 mmap(2) 仅列出了以下对 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.
  • flags does not include either MAP_PRIVATE or MAP_SHARED.
  • The len argument was negative.
  • The offset argument was not page-aligned based on the page size as returned by getpagesize(3).

[...]

  • The flags parameter must specify either MAP_PRIVATE or MAP_SHARED.
  • The size parameter must not be 0.
  • The off parameter must be a multiple of pagesize, as returned by sysconf().

虽然我还没有弄清楚实现的所有细节,但这个 XNU 内核源文件的评论明确提到能够映射 block 设备(只要它是共享的):https://www.opensource.apple.com/source/xnu/xnu-2422.1.72/bsd/kern/kern_mman.c

我错过了什么?

最佳答案

您的问题可能出在使用 MAP_FILE 上,因为这表示常规文件而不是 block 设备。

如果这不起作用,请在打开文件后尝试调用 fstat() 并检查文件的长度。当我使用 stat -x 获取有关系统上 block 设备的信息时,文件大小报告为零(ls -l 报告大小为“1”)。零长度文件也可能会阻止您创建映射。

关于c - 在 Mac OS X 上映射一个 block 设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24520474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com