3

有没有办法通过 OSX(10.8+)中的用户空间创建块设备,没有 3rd 方库(FUSE 等)?

我正在尝试创建一个用户空间工具。这个想法是用户向工具提供一个文件,并且该工具创建一个虚拟界面。每当写入接口时,该工具都会对数据应用操作,然后写入原始文件。每当读取接口时,该工具都会从原始文件中读取并应用逆操作。

我不一定需要块设备。该工具需要创建某种可以被视为文件的虚拟界面,即它可以被另一个应用程序打开和保存。

我查看了 I/O Kit 的用户空间例程,但似乎没有什么适用的,因为创建虚拟 USB/FireWire/MMC/SCSI 设备似乎太过分了。

4

1 回答 1

2

在不进入内核空间的情况下,我能想到的最接近的东西是 fifo 或命名管道——这本质上是一个带有文件名的管道。不幸的是,作为一个管道,你不能寻找,等等 - 你可以打开 fifo 以便在一个进程中读取并在另一个进程中写入。您可以使用mkfifo命令行实用程序或mkfifo() C 函数来创建它们。

还有 UNIX 域套接字,它们类似于 IP 套接字,但同样由文件名标识,而不是网络结构。这些可以从两端读取和写入,但同样不能搜索。

至于实际实现 vnode 的 ops 函数(OSX 中文件的内核表示),我相信您确实必须放弃内核。请注意,对于创建块设备来说,I/O 工具包并不是绝对必要的——如果 BSD 设备节点足够,并且您不需要支持硬件或弹出卷等。您可以简单地创建一个节点bdevsw_add(),提供ops 向量作为参数。(对于基于 I/O Kit 的存储设备,它IOMediaBSDClient会自动执行此操作,同时使用 创建字符设备cdevsw_add_with_bdev())另一个更复杂的选项是实现您自己的文件系统。

于 2013-03-18T10:49:56.070 回答