You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mac OS X下如何通过kext(内核扩展)打开访问硬盘卷

问题描述

在应用中尝试通过如下代码打开(访问)硬盘卷:

int mode=0;
int hd_h=-1;
const char* device  =   "/dev/rdisk1";
mode=O_RDWR|mode_basic;
hd_h = open(device, mode);

执行上述代码时返回Operation not permitted错误。经调研得知可通过kext实现该需求,目前已编写在内核空间访问硬盘的示例kext(驱动),创建了IOUserClient子类,且已在用户空间调用IOServiceOpen(),需要明确技术实现路径:如何在kext中打开硬盘卷并将访问句柄返回至用户空间?
当前编写的用户空间服务匹配代码如下:

CFDictionaryRef     matchingDict = NULL;
io_iterator_t       iter = 0;
io_service_t        service = 0;
kern_return_t       kr;

// Create a matching dictionary that will find any USB device
matchingDict = IOServiceMatching("com_osxkernel_driver_IOKitTest");

// Create an iterator for all IO Registry objects that match the dictionary
kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS)
    return -1;    
实现方案

注意:内核态和用户态地址空间完全隔离,内核态打开设备返回的句柄属于内核态资源,直接传递数值到用户态完全无法使用,正确逻辑是kext内部持有硬盘设备的访问引用,通过IOUserClient的跨态通信通道转发IO请求,不要做跨态直接传递内核句柄的操作。

1. kext侧打开目标硬盘设备

  • 不要在内核中硬编码/dev/rdisk1这类BSD路径,通过IOKit匹配规则定位目标设备:如果要访问整块物理磁盘,匹配IOMedia类且Whole属性为true的实例;如果要访问单个分区卷,匹配对应BSD名称的IOMedia实例即可。
  • 匹配到目标设备对象后,调用设备对象的open(this, 0)方法获取打开引用,打开成功后将该设备对象指针存储在自定义kext类的成员变量中,持有引用直到连接关闭。
  • 注意:受SIP(系统完整性保护)锁定的系统卷,即使kext运行在内核态也无法完成写入操作,测试前先确认目标卷不属于SIP保护范围。

2. 基于IOUserClient实现跨态IO转发

  • 在自定义的IOUserClient子类中重写externalMethod方法,自定义一组操作枚举值,分别对应磁盘读、磁盘写、获取磁盘参数、关闭设备几类核心操作。
  • 收到用户态传入的对应操作请求时,调用之前持有的存储设备对象的read/write方法完成实际IO,通过IOExternalMethodArguments提供的输出缓冲区、内存描述符将读取到的数据、操作结果回传给用户态。
  • 重写clientClose方法,当用户态进程退出或主动断开连接时,调用持有设备对象的close(this)方法释放引用,避免内核资源泄漏。

3. 用户态侧逻辑修正

  • 现有匹配字典逻辑可正常工作,迭代到匹配的io_service_t实例后,调用IOServiceOpen(service, mach_task_self(), 0, &connect)获取io_connect_t类型的连接句柄,该句柄是用户态和kext通信的唯一有效凭证。
  • 后续所有磁盘IO操作,均通过IOConnectCallStructMethod/IOConnectCallMethod接口传入对应操作码、参数缓冲区,和kext侧externalMethod的分发逻辑一一对应,完成IO请求的下发和结果接收。
  • 所有操作完成后调用IOServiceClose(connect)主动关闭连接,触发kext侧的资源回收逻辑。

补充说明:macOS 10.15及以上版本对kext的签名、加载权限有极严格的限制,未经过苹果官方公证的kext默认无法加载,测试自研kext需要先关闭SIP。如果是面向普通用户分发的应用,不建议采用kext方案,可优先尝试通过DiskArbitration框架申请设备访问权限后在用户态直接操作/dev/disk*设备,避免kext带来的系统稳定性风险和审核障碍。

内容的提问来源于stack exchange,提问作者Sudhanshu Pareek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:18:14