为macOS开发用户空间只读磁盘驱动程序

问题描述 投票:0回答:1

我有一种特殊的磁盘映像格式(已压缩,并带有诸如坏块之类的其他信息,并希望在macOS中将其用作块设备(例如,在/dev/rdisk下)。

我正在寻找有关如何编写只读块级用户空间驱动程序的指针。

我相信我需要使用IOKit进行此操作,但是该文档在该领域相当稀疏,据我所知,没有提供任何示例代码。

我看过阿米特·辛格(Amit Singh)的Mac OS Internals,但这仅涉及对通过添加的驱动程序路由的现有块进行文件处理。但是我需要从一个单独的文件中读取数据,即,我需要使用文件系统,并且如果可能的话,我也想在用户空间应用程序中执行此操作,因为制作kext既难以调试,现在也已被弃用。

理想情况下,这应该适用于当前的macOS版本,包括10.15,但我也对仅适用于从10.6开始的旧macOS版本适用的解决方案感到满意。

也许我在这里仍然误解了一些事情。我的印象是,甚至可以在10.15之前编写用户空间IOKit驱动程序。但是也许块存储设备无法做到这一点?任何澄清都将受到欢迎。我感到很失落。

macos disk iokit
1个回答
0
投票

也许我在这里仍然误解了一些事情。我的印象是,甚至可以在10.15之前编写用户空间IOKit驱动程序。

这是一个正确的语句,但这并不意味着即使在10.15中也可以在用户空间中编写所有类型的驱动程序。混淆可能源于以下事实:“ IOKit”用于在不同的上下文中表示微妙的不同事物:

  • 从根本上讲,它是基于OOP的驱动程序堆栈技术,它内置于用C ++编写的XNU内核(macOS,iOS等)中。它的核心数据结构是I / O Kit注册表,它是对象的有向图,这些对象代表设备,设备(子)功能,虚拟设备,服务,驱动程序,用户空间客户端连接等。(大多数属性具有它,但是从技术上讲,节点可以有多个“父”节点,有些实际上是在您的典型Mac系统上做到的)
  • IOKit用户空间库。 (也称为IOKit.framework亦称为IOKitLib +各种IOCFPlugins),它们向用户空间程序提供内核的I / O注册表的view,并允许它们与IOKit对象执行某些交互。这基本上限于:
    • 根据匹配规则遍历注册表图和匹配服务。二者都将句柄返回到用户空间程序的特定I / O注册表项。
    • 获取I / O注册表项的属性,如果对象明确支持它,则设置(某些)属性。
    • 创建用户客户端连接。这是从常规用户空间create在I / O注册表中的条目的唯一方法,并且它们始终是IOUserClient子类,并且仅在父对象明确允许的情况下才可以。
  • IODrive视图可用于基于DriverKit的系统扩展过程(10.15中的新增功能,该视图允许实例化完全由用户空间支持的注册表项对象,以子类化(绑定)选择的超类类型。
  • 要回答您的具体情况的问题:

  • 要为块存储设备实现将在系统中以其他任何形式出现的驱动程序,您需要子类IOStorage或其子类之一(通常为IOBlockStorageDevice)。
  • IOKit.framework允许您创建用户空间驱动程序,该用户空间驱动程序将由该用户空间进程或其他用户空间进程only
  • 使用。 因此,无法使用它来创建将被内核某些部分使用的驱动程序。例如,不可能创建将由内核的VFS系统使用的块设备驱动程序。
  • DriverKit当前(自macOS 10.15.4 SDK起)不允许任何存储堆栈类的由dext支持的子类。因此,dext无法解决问题。
  • 据我所知,做您想做的事情的唯一方法是有一个两部分的驱动程序:一个实现IOBlockStorageDevice子类的kext,以及一个为用户提供服务的服务。客户端接口,用于连接某些用户空间进程以创建块设备的实例,该接口将处理对该设备的I / O请求。这是类似于FUSE机制的一种,该机制在VFS层而不是块层起作用。这正是macOS的内置磁盘映像安装系统的工作方式。不幸的是,它的kext或用户空间部分都不是开源的,文档化的或公共的API。因此,除非您对它进行反向工程并找到不满足Apple代码签名要求的边界
  • ,否则基本上必须重新实现它。

    我目前尚不知道现有的开源系统可以做到这一点,但是我看上去并不难。

请注意,如果它代表的块设备托管了您要挂载的文件系统,并且该文件系统的FUSE实现存在,那么您也可以使用FUSE打开磁盘映像。

© www.soinside.com 2019 - 2024. All rights reserved.