我有一种特殊的磁盘映像格式(已压缩,并带有诸如坏块之类的其他信息,并希望在macOS中将其用作块设备(例如,在/dev/rdisk
下)。
我正在寻找有关如何编写只读块级用户空间驱动程序的指针。
我相信我需要使用IOKit进行此操作,但是该文档在该领域相当稀疏,据我所知,没有提供任何示例代码。
我看过阿米特·辛格(Amit Singh)的Mac OS Internals,但这仅涉及对通过添加的驱动程序路由的现有块进行文件处理。但是我需要从一个单独的文件中读取数据,即,我需要使用文件系统,并且如果可能的话,我也想在用户空间应用程序中执行此操作,因为制作kext既难以调试,现在也已被弃用。
理想情况下,这应该适用于当前的macOS版本,包括10.15,但我也对仅适用于从10.6开始的旧macOS版本适用的解决方案感到满意。
也许我在这里仍然误解了一些事情。我的印象是,甚至可以在10.15之前编写用户空间IOKit驱动程序。但是也许块存储设备无法做到这一点?任何澄清都将受到欢迎。我感到很失落。
也许我在这里仍然误解了一些事情。我的印象是,甚至可以在10.15之前编写用户空间IOKit驱动程序。
这是一个正确的语句,但这并不意味着即使在10.15中也可以在用户空间中编写所有类型的驱动程序。混淆可能源于以下事实:“ IOKit”用于在不同的上下文中表示微妙的不同事物:
IOKit.framework
亦称为IOKitLib +各种IOCFPlugins),它们向用户空间程序提供内核的I / O注册表的view,并允许它们与IOKit对象执行某些交互。这基本上限于:IOUserClient
子类,并且仅在父对象明确允许的情况下才可以。要回答您的具体情况的问题:
IOStorage
或其子类之一(通常为IOBlockStorageDevice
)。IOKit.framework
允许您创建用户空间驱动程序,该用户空间驱动程序将由该用户空间进程或其他用户空间进程onlyIOBlockStorageDevice
子类的kext,以及一个为用户提供服务的服务。客户端接口,用于连接某些用户空间进程以创建块设备的实例,该接口将处理对该设备的I / O请求。这是类似于FUSE机制的一种,该机制在VFS层而不是块层起作用。这正是macOS的内置磁盘映像安装系统的工作方式。不幸的是,它的kext或用户空间部分都不是开源的,文档化的或公共的API。因此,除非您对它进行反向工程并找到不满足Apple代码签名要求的边界我目前尚不知道现有的开源系统可以做到这一点,但是我看上去并不难。
请注意,如果它代表的块设备托管了您要挂载的文件系统,并且该文件系统的FUSE实现存在,那么您也可以使用FUSE打开磁盘映像。