Skip to content

Latest commit

 

History

History
1428 lines (1161 loc) · 46 KB

File metadata and controls

1428 lines (1161 loc) · 46 KB

IOKit 框架文档总结

来源: Apple Developer Documentation - IOKit

平台: iOS 16.0+ / iPadOS 16.0+ / Mac Catalyst 13.0+ / macOS 10.0+ / visionOS 1.0+

语言: Swift(C/Objective-C 接口)


一、概述

IOKit 是 Apple 的硬件驱动基础设施框架,提供了从用户空间(userspace)访问 IOKit 对象(如驱动、nub、设备)的非内核接口。它是 macOS 和 iOS 硬件交互的底层基础。

核心设计理念

IOKit 在用户空间通过 设备接口(device-interface)机制 实现非内核访问,核心抽象包括:

  • IORegistry(注册表):一个分平面(plane)的有向图,描述内核中所有 IOKit 对象之间的从属关系
  • IOService(服务对象):代表硬件设备或驱动程序的内核对象
  • Matching(匹配):通过匹配字典查找特定类型的设备
  • IOConnect(连接):与内核驱动建立通信通道,用于发送命令和交换数据

重要提示:macOS 11+ 上支持的设备需要使用 DriverKit。IOKit 在应用和服务中用于发现和使用设备。


二、模块结构

IOKit 框架在 Swift 文档中组织为以下模块:

模块 说明
IOKitLib.h 核心 API:对象管理、注册表访问、服务匹配、通知、连接操作
IODataQueueClient.h 共享内存数据队列的客户端 API
IOTypes.h User-Space 基础类型定义和常量
IOKit Structures 框架使用的数据结构体
IOKit Enumerations 匿名枚举(各种位掩码和选项常量)
IOKit Constants 全局常量(属性键、返回码、通知名称等)
IOKit Functions 独立的工具函数(序列化、目录管理等)
IOKit Data Types 类型别名(包括核心 opaque 类型)

三、核心类型(Data Types)

IOKit 使用 opaque 类型引用内核对象,所有从函数获取的对象必须通过 IOObjectRelease() 释放。

3.1 核心对象类型

typealias io_object_t = ...          // 所有 IOKit 对象的基类型
typealias io_registry_entry_t = io_object_t   // 注册表条目
typealias io_service_t = io_object_t           // 服务对象(继承自 registry entry)
typealias io_connect_t = io_object_t           // 内核连接句柄
typealias io_iterator_t = io_object_t          // 对象迭代器
typealias io_enumerator_t = io_object_t        // 对象枚举器

io_service_tio_object_t 的别名。在内核中 IOServiceIORegistryEntry 的子类,因此所有 IORegistryEntryXXX 函数都可以用于 io_service_t

3.2 引用和端口类型

typealias IONotificationPortRef = ...  // 通知端口引用
typealias OSObjectRef = ...          // OSObject 引用
typealias io_ident_t = ...           // 对象标识符
typealias uext_object_t = ...        // 用户空间扩展对象

3.3 数值类型

typealias IOReturn = kern_return_t        // IOKit 返回码
typealias IOOptionBits = UInt32           // 选项位掩码
typealias IOByteCount = ...               // 字节计数
typealias IOByteCount32 = UInt32          // 32位字节计数
typealias IOByteCount64 = UInt64          // 64位字节计数
typealias IOItemCount = UInt32            // 项目计数
typealias IOFixed = Int32                 // 定点数
typealias IOVersion = UInt32              // 版本号
typealias IOMessage = UInt32              // 消息类型

3.4 地址和长度类型

typealias IOPhysicalAddress = mach_vm_address_t     // 物理地址
typealias IOPhysicalAddress32 = UInt32              // 32位物理地址
typealias IOPhysicalAddress64 = UInt64              // 64位物理地址
typealias IOPhysicalLength = mach_vm_size_t         // 物理长度
typealias IOPhysicalLength32 = UInt32               // 32位物理长度
typealias IOPhysicalLength64 = UInt64               // 64位物理长度
typealias IOVirtualAddress = mach_vm_address_t      // 虚拟地址
typealias IOLogicalAddress = ...                    // 逻辑地址
typealias IOAddressRange = ...                      // 地址范围
typealias IOAlignment = UInt32                      // 对齐
typealias IOCacheMode = UInt32                      // 缓存模式
typealias IODeviceNumber = UInt32                   // 设备号

3.5 数据结构类型

typealias IODataQueueMemory          // 数据队列头部映射结构体
typealias IODataQueueEntry            // 数据队列条目
typealias IODataQueueAppendix         // 数据队列附加区域映射结构体
typealias IOCFPlugInInterface         // CF 插件接口
typealias OSAsyncReference            // 异步回调引用(最大 kOSAsyncRefSize)
typealias OSAsyncReference64          // 64位异步回调引用

四、IOKitLib.h — 核心 API

4.1 对象生命周期管理

// 增加引用计数
func IOObjectRetain(_ object: io_object_t) -> kern_return_t

// 释放对象(减少引用计数,计数为0时释放)
func IOObjectRelease(_ object: io_object_t) -> kern_return_t

// 获取内核引用计数
func IOObjectGetKernelRetainCount(_ object: io_object_t) -> UInt32

// 获取用户空间引用计数(当前进程)
func IOObjectGetUserRetainCount(_ object: io_object_t) -> UInt32

// 获取内核引用计数(macOS 10.6之前的旧接口,与 IOObjectGetKernelRetainCount 相同)
func IOObjectGetRetainCount(_ object: io_object_t) -> UInt32

// 检查两个对象句柄是否表示同一内核对象
func IOObjectIsEqualTo(_ a: io_object_t, _ b: io_object_t) -> boolean_t

4.2 对象类型内省

// 获取 IOKit 对象的类名(返回 CFString)
func IOObjectCopyClass(_ object: io_object_t) -> Unmanaged<CFString>!

// 获取 IOKit 对象的类名(写入C缓冲区)
func IOObjectGetClass(_ object: io_object_t, _ className: UnsafeMutablePointer<CChar>!) -> kern_return_t

// 检查对象是否符合指定类名(类似 OSDynamicCast)
func IOObjectConformsTo(_ object: io_object_t, _ className: UnsafePointer<CChar>!) -> boolean_t

// 获取给定类的 Bundle Identifier
func IOObjectCopyBundleIdentifierForClass(_ className: CFString!) -> Unmanaged<CFString>!

// 获取给定类的父类名
func IOObjectCopySuperclassForClass(_ className: CFString!) -> Unmanaged<CFString>!

4.3 注册表(IORegistry)访问

IOKit 注册表是一个有向图,每个条目可以有多个父条目(跨不同平面)。常见平面包括 IOServiceIODeviceTreeIOPowerIOUSBIOAudioIOFireWire

根条目与迭代器

// 获取注册表根条目
func IORegistryGetRootEntry(_ masterPort: mach_port_t) -> io_registry_entry_t

// 创建从根条目开始的迭代器
func IORegistryCreateIterator(
    _ masterPort: mach_port_t,
    _ plane: UnsafePointer<CChar>!,
    _ options: IOOptionBits,
    _ iterator: UnsafeMutablePointer<io_iterator_t>!
) -> kern_return_t

// 创建从指定条目开始的迭代器
func IORegistryEntryCreateIterator(
    _ entry: io_registry_entry_t,
    _ plane: UnsafePointer<CChar>!,
    _ options: IOOptionBits,
    _ iterator: UnsafeMutablePointer<io_iterator_t>!
) -> kern_return_t

// 按路径查找注册表条目
func IORegistryEntryFromPath(
    _ masterPort: mach_port_t,
    _ path: UnsafePointer<CChar>!
) -> io_registry_entry_t

条目遍历

// 获取条目的父条目
func IORegistryEntryGetParentEntry(
    _ entry: io_registry_entry_t,
    _ plane: UnsafePointer<CChar>!,
    _ parent: UnsafeMutablePointer<io_registry_entry_t>!
) -> kern_return_t

// 获取父条目的迭代器
func IORegistryEntryGetParentIterator(
    _ entry: io_registry_entry_t,
    _ plane: UnsafePointer<CChar>!,
    _ iterator: UnsafeMutablePointer<io_iterator_t>!
) -> kern_return_t

// 获取条目的子条目
func IORegistryEntryGetChildEntry(
    _ entry: io_registry_entry_t,
    _ plane: UnsafePointer<CChar>!,
    _ child: UnsafeMutablePointer<io_registry_entry_t>!
) -> kern_return_t

// 获取子条目的迭代器
func IORegistryEntryGetChildIterator(
    _ entry: io_registry_entry_t,
    _ plane: UnsafePointer<CChar>!,
    _ iterator: UnsafeMutablePointer<io_iterator_t>!
) -> kern_return_t

// 检查条目是否在某平面中
func IORegistryEntryInPlane(
    _ entry: io_registry_entry_t,
    _ plane: UnsafePointer<CChar>!
) -> boolean_t

条目信息

// 获取条目名称
func IORegistryEntryGetName(
    _ entry: io_registry_entry_t,
    _ name: UnsafeMutablePointer<CChar>!
) -> kern_return_t

// 获取条目在指定平面中的名称
func IORegistryEntryGetNameInPlane(
    _ entry: io_registry_entry_t,
    _ plane: UnsafePointer<CChar>!,
    _ name: UnsafeMutablePointer<CChar>!
) -> kern_return_t

// 获取条目在指定平面中的位置
func IORegistryEntryGetLocationInPlane(
    _ entry: io_registry_entry_t,
    _ plane: UnsafePointer<CChar>!,
    _ location: UnsafeMutablePointer<CChar>!
) -> kern_return_t

// 获取条目的路径
func IORegistryEntryGetPath(
    _ entry: io_registry_entry_t,
    _ plane: UnsafePointer<CChar>!,
    _ path: UnsafeMutablePointer<CChar>!
) -> kern_return_t

// 获取全局唯一的注册表条目 ID
func IORegistryEntryGetRegistryEntryID(
    _ entry: io_registry_entry_t,
    _ entryID: UnsafeMutablePointer<UInt64>!
) -> kern_return_t

属性操作

// 创建条目属性表的 CF 字典表示
func IORegistryEntryCreateCFProperties(
    _ entry: io_registry_entry_t,
    _ properties: UnsafeMutablePointer<Unmanaged<CFMutableDictionary>?>!,
    _ allocator: CFAllocator!,
    _ options: IOOptionBits
) -> kern_return_t

// 创建条目单个属性的 CF 表示
func IORegistryEntryCreateCFProperty(
    _ entry: io_registry_entry_t,
    _ key: CFString!,
    _ allocator: CFAllocator!,
    _ options: IOOptionBits
) -> Unmanaged<CFTypeRef>!

// 在条目及其父条目链中搜索属性
func IORegistryEntrySearchCFProperty(
    _ entry: io_registry_entry_t,
    _ plane: UnsafePointer<CChar>!,
    _ key: CFString!,
    _ allocator: CFAllocator!,
    _ options: IOOptionBits
) -> CFTypeRef!

// 设置 CF 容器属性
func IORegistryEntrySetCFProperties(
    _ entry: io_registry_entry_t,
    _ properties: CFTypeRef!
) -> kern_return_t

// 设置单个 CF 属性
func IORegistryEntrySetCFProperty(
    _ entry: io_registry_entry_t,
    _ key: CFString!,
    _ property: CFTypeRef!
) -> kern_return_t

4.4 迭代器操作

// 获取迭代器中的下一个对象
func IOIteratorNext(_ iterator: io_iterator_t) -> io_object_t

// 检查迭代器是否仍然有效
func IOIteratorIsValid(_ iterator: io_iterator_t) -> boolean_t

// 重置迭代器到起始位置
func IOIteratorReset(_ iterator: io_iterator_t)

// 递归进入当前条目
func IORegistryIteratorEnterEntry(_ iterator: io_iterator_t) -> kern_return_t

// 退出递归层
func IORegistryIteratorExitEntry(_ iterator: io_iterator_t) -> kern_return_t

4.5 服务匹配与查找

匹配字典是 IOKit 设备发现的核心机制。通过创建匹配字典并调用匹配函数,可以找到特定类型的设备。

// 创建匹配指定类的字典
func IOServiceMatching(_ name: UnsafePointer<CChar>!) -> CFMutableDictionary!

// 创建匹配指定名称的字典
func IOServiceNameMatching(_ name: UnsafePointer<CChar>!) -> CFMutableDictionary!

// 创建匹配指定 BSD 设备名的字典
func IOBSDNameMatching(
    _ masterPort: mach_port_t,
    _ options: UInt32,
    _ bsdName: UnsafePointer<CChar>!
) -> CFMutableDictionary!

// 创建匹配指定注册表条目 ID 的字典
func IORegistryEntryIDMatching(_ entryID: UInt64) -> CFMutableDictionary!

// 查找单个匹配的服务
func IOServiceGetMatchingService(
    _ masterPort: mach_port_t,
    _ matching: CFDictionary!
) -> io_service_t

// 查找所有匹配的服务
func IOServiceGetMatchingServices(
    _ masterPort: mach_port_t,
    _ matching: CFDictionary!,
    _ existing: UnsafeMutablePointer<io_iterator_t>!
) -> kern_return_t

// 匹配服务属性表
func IOServiceMatchPropertyTable(
    _ service: io_service_t,
    _ matching: CFDictionary!,
    _ matches: UnsafeMutablePointer<boolean_t>!
) -> kern_return_t

4.6 通知机制

通知端口管理

// 创建通知端口(用于接收设备变更通知)
func IONotificationPortCreate(
    _ masterPort: mach_port_t
) -> IONotificationPortRef!

// 销毁通知端口(同时销毁关联的 mach_port 和 RunLoopSource)
func IONotificationPortDestroy(_ notify: IONotificationPortRef!)

// 获取用于监听通知的 mach_port
func IONotificationPortGetMachPort(
    _ notify: IONotificationPortRef!
) -> mach_port_t

// 获取用于 RunLoop 监听通知的 CFRunLoopSource
func IONotificationPortGetRunLoopSource(
    _ notify: IONotificationPortRef!
) -> Unmanaged<CFRunLoopSource>!

// 设置 DispatchQueue 来接收通知
func IONotificationPortSetDispatchQueue(
    _ notify: IONotificationPortRef!,
    _ queue: dispatch_queue_t!
)

通知注册

// 注册匹配通知:已发布的服务 + 监听新服务
func IOServiceAddMatchingNotification(
    _ notifyPort: IONotificationPortRef!,
    _ notificationType: UnsafePointer<CChar>!,
    _ matching: CFDictionary!,
    _ callback: IOServiceMatchingCallback!,
    _ refCon: UnsafeMutableRawPointer!,
    _ notification: UnsafeMutablePointer<io_iterator_t>!
) -> kern_return_t

// 注册服务状态变更通知(如 BusyState 变化)
func IOServiceAddInterestNotification(
    _ notifyPort: IONotificationPortRef!,
    _ interestType: UnsafePointer<CChar>!,
    _ service: io_service_t,
    _ callback: IOServiceInterestCallback!,
    _ refCon: UnsafeMutableRawPointer!,
    _ notification: UnsafeMutablePointer<io_object_t>!
) -> kern_return_t

// 创建通知接收端口
func IOCreateReceivePort(
    _ msgType: UInt32,
    _ receivePort: UnsafeMutablePointer<mach_port_t>!
) -> kern_return_t

// 从 mach 消息分发回调通知
func IODispatchCalloutFromMessage(
    _ refCon: UnsafeMutableRawPointer!,
    _ msg: UnsafeMutablePointer<mach_msg_header_t>!,
    _ ref: UnsafeMutableRawPointer!
)

4.7 驱动连接(IOConnect)

通过 io_connect_t 句柄与内核驱动通信。

// 打开与 IOService 的连接
func IOServiceOpen(
    _ service: io_service_t,
    _ owningTask: task_port_t,
    _ type: UInt32,
    _ connect: UnsafeMutablePointer<io_connect_t>!
) -> kern_return_t

// 关闭连接并销毁句柄
func IOServiceClose(_ connect: io_connect_t) -> kern_return_t

// 增加连接句柄引用计数
func IOConnectAddRef(_ connect: io_connect_t) -> kern_return_t

// 释放连接句柄
func IOConnectRelease(_ connect: io_connect_t) -> kern_return_t

// 获取连接对应的 IOService
func IOConnectGetService(
    _ connect: io_connect_t,
    _ service: UnsafeMutablePointer<io_service_t>!
) -> kern_return_t

// 添加第二个连接(如客户端连接)
func IOConnectAddClient(
    _ connect: io_connect_t,
    _ client: io_connect_t
) -> kern_return_t

// 设置 CF 容器属性
func IOConnectSetCFProperties(
    _ connect: io_connect_t,
    _ properties: CFTypeRef!
) -> kern_return_t

// 设置单个 CF 属性
func IOConnectSetCFProperty(
    _ connect: io_connect_t,
    _ key: CFString!,
    _ property: CFTypeRef!
) -> kern_return_t

// 设置通知端口(用于接收驱动特定通知)
func IOConnectSetNotificationPort(
    _ connect: io_connect_t,
    _ type: UInt32,
    _ port: mach_port_t,
    _ reference: UInt
) -> kern_return_t

内存映射

// 将硬件或共享内存映射到调用者的任务空间(32位)
func IOConnectMapMemory(
    _ connect: io_connect_t,
    _ memoryType: UInt32,
    _ intoTask: task_port_t,
    _ address: UnsafeMutablePointer<mach_vm_address_t>!,
    _ size: UnsafeMutablePointer<mach_vm_size_t>!,
    _ options: IOOptionBits
) -> kern_return_t

// 将硬件或共享内存映射到调用者的任务空间(64位)
func IOConnectMapMemory64(
    _ connect: io_connect_t,
    _ memoryType: UInt32,
    _ intoTask: task_port_t,
    _ address: UnsafeMutablePointer<mach_vm_address_t>!,
    _ size: UnsafeMutablePointer<mach_vm_size_t>!,
    _ options: IOOptionBits
) -> kern_return_t

// 取消 IOConnectMapMemory 创建的映射
func IOConnectUnmapMemory(
    _ connect: io_connect_t,
    _ memoryType: UInt32,
    _ fromTask: task_port_t,
    _ address: mach_vm_address_t
) -> kern_return_t

// 取消 IOConnectMapMemory64 创建的映射
func IOConnectUnmapMemory64(
    _ connect: io_connect_t,
    _ memoryType: UInt32,
    _ fromTask: task_port_t,
    _ address: mach_vm_address_t
) -> kern_return_t

4.8 系统状态

// 获取所有 IOService 的 busyState
func IOKitGetBusyState(
    _ masterPort: mach_port_t,
    _ busyState: UnsafeMutablePointer<UInt32>!
) -> kern_return_t

// 等待所有 IOService 的 busyState 变为 0
func IOKitWaitQuiet(
    _ masterPort: mach_port_t,
    _ wait: UnsafeMutablePointer<mach_timespec_t>!
) -> kern_return_t

// 获取单个服务的 busyState
func IOServiceGetBusyState(
    _ service: io_service_t,
    _ busyState: UnsafeMutablePointer<UInt32>!
) -> kern_return_t

// 等待单个服务 quiet
func IOServiceWaitQuiet(
    _ service: io_service_t,
    _ wait: UnsafeMutablePointer<mach_timespec_t>!
) -> kern_return_t

// 请求重新扫描总线
func IOServiceRequestProbe(
    _ service: io_service_t,
    _ options: UInt32
) -> kern_return_t

4.9 IOMasterPort / IOMainPort

// 获取 IOKit 通信的主端口(传统接口)
func IOMasterPort(
    _ bootstrapPort: mach_port_t,
    _ masterPort: UnsafeMutablePointer<mach_port_t>!
) -> kern_return_t

// 获取 IOKit 通信的主端口(推荐使用)
func IOMainPort(
    _ bootstrapPort: mach_port_t,
    _ mainPort: UnsafeMutablePointer<mach_port_t>!
) -> kern_return_t

4.10 回调类型

// 服务匹配通知回调
typealias IOServiceMatchingCallback = (
    UnsafeMutableRawPointer!,      // refCon
    io_iterator_t                  // iterator (新匹配的服务迭代器)
) -> Void

// 服务状态变更回调
typealias IOServiceInterestCallback = (
    UnsafeMutableRawPointer!,      // refCon
    io_service_t,                  // service
    UInt32,                        // messageType
    UnsafeMutableRawPointer!       // messageArgument
) -> Void

// 异步 I/O 完成回调(无额外参数)
typealias IOAsyncCallback0 = (
    UnsafeMutableRawPointer!,      // refCon
    IOReturn                       // result
) -> Void

// 异步 I/O 完成回调(1个额外参数,通常是传输字节数)
typealias IOAsyncCallback1 = (
    UnsafeMutableRawPointer!,      // refCon
    IOReturn,                      // result
    UnsafeMutableRawPointer!       // args[0]
) -> Void

// 异步 I/O 完成回调(2个额外参数)
typealias IOAsyncCallback2 = (
    UnsafeMutableRawPointer!,      // refCon
    IOReturn,                      // result
    UnsafeMutableRawPointer!,      // args[0]
    UnsafeMutableRawPointer!       // args[1]
) -> Void

// 通用异步回调(多参数)
typealias IOAsyncCallback = (
    UnsafeMutableRawPointer!,      // refCon
    IOReturn,                      // result
    UnsafeMutablePointer<UnsafeMutableRawPointer?>!  // args[]
) -> Void

五、IODataQueueClient.h — 数据队列 API

数据队列使用共享内存区域在用户空间和内核之间高效传递数据。

// 分配并返回一个新的 mach 端口,用于接收数据可用通知
func IODataQueueAllocateNotificationPort() -> mach_port_t

// 检查队列中是否有可用数据
func IODataQueueDataAvailable(
    _ queue: UnsafeMutablePointer<IODataQueueMemory>!
) -> Bool

// 从队列中取出下一条可用条目
func IODataQueueDequeue(
    _ queue: UnsafeMutablePointer<IODataQueueMemory>!,
    _ data: UnsafeMutableRawPointer!,
    _ dataSize: UnsafeMutablePointer<UInt32>!
) -> IOReturn

// 向队列中插入新条目
func IODataQueueEnqueue(
    _ queue: UnsafeMutablePointer<IODataQueueMemory>!,
    _ data: UnsafeMutableRawPointer!,
    _ dataSize: UInt32
) -> IOReturn

// 查看队列中的下一条条目(不出队)
func IODataQueuePeek(
    _ queue: UnsafeMutablePointer<IODataQueueMemory>!
) -> UnsafeMutablePointer<IODataQueueEntry>!

// 为队列设置通知端口
func IODataQueueSetNotificationPort(
    _ queue: UnsafeMutablePointer<IODataQueueMemory>!,
    _ port: mach_port_t
) -> IOReturn

// 等待队列上到达的数据可用消息
func IODataQueueWaitForAvailableData(
    _ queue: UnsafeMutablePointer<IODataQueueMemory>!,
    _ port: mach_port_t
) -> IOReturn

数据结构

// 数据队列头部映射结构体
typealias IODataQueueMemory

// 数据队列条目
typealias IODataQueueEntry

// 数据队列附加区域映射结构体
typealias IODataQueueAppendix

六、IOKit Functions — 独立函数

6.1 序列化/反序列化

// 将 CF 对象序列化为二进制数据
func IOCFSerialize(_ object: CFTypeRef!, _ options: CFOptionFlags) -> CFData!

// 从 C 字符串反序列化 CF 对象
func IOCFUnserialize(
    _ buffer: UnsafePointer<CChar>!,
    _ allocator: CFAllocator!,
    _ options: CFOptionFlags,
    _ errorString: UnsafeMutablePointer<Unmanaged<CFString>?>!
) -> CFTypeRef!

// 从带大小的二进制数据反序列化
func IOCFUnserializeBinary(
    _ buffer: UnsafePointer<CChar>!,
    _ bufferSize: Int,
    _ allocator: CFAllocator!,
    _ options: CFOptionFlags,
    _ errorString: UnsafeMutablePointer<Unmanaged<CFString>?>!
) -> CFTypeRef!

// 从带大小的数据反序列化
func IOCFUnserializeWithSize(
    _ buffer: UnsafePointer<CChar>!,
    _ bufferSize: Int,
    _ allocator: CFAllocator!,
    _ options: CFOptionFlags,
    _ errorString: UnsafeMutablePointer<Unmanaged<CFString>?>!
) -> CFTypeRef!

6.2 插件接口

// 为服务创建 CF 插件接口
func IOCreatePlugInInterfaceForService(
    _ service: io_service_t,
    _ pluginType: CFUUID!,
    _ interfaceType: CFUUID!,
    _ theInterface: UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<IOCFPlugInInterface>?>?>!,
    _ theScore: UnsafeMutablePointer<Int32>!
) -> kern_return_t

// 销毁插件接口
func IODestroyPlugInInterface(
    _ theInterface: UnsafeMutablePointer<UnsafeMutablePointer<IOCFPlugInInterface>?>!
) -> kern_return_t

6.3 连接方法调用

这些函数通过 mach 端口向内核驱动发送方法和参数:

// 调用标量方法(仅标量参数和返回值)
func IOConnectCallScalarMethod(
    _ connect: mach_port_t,
    _ selector: UInt32,
    _ input: UnsafePointer<UInt64>!,
    _ inputCnt: UInt32,
    _ output: UnsafeMutablePointer<UInt64>!,
    _ outputCnt: UnsafeMutablePointer<UInt32>!
) -> kern_return_t

// 调用结构体方法(仅结构体参数和返回值)
func IOConnectCallStructMethod(
    _ connect: mach_port_t,
    _ selector: UInt32,
    _ inputStruct: UnsafeRawPointer!,
    _ inputStructCnt: Int,
    _ outputStruct: UnsafeMutableRawPointer!,
    _ outputStructCnt: UnsafeMutablePointer<Int>!
) -> kern_return_t

// 调用标量+结构体组合方法
func IOConnectCallMethod(
    _ connect: mach_port_t,
    _ selector: UInt32,
    _ inputScalar: UnsafePointer<UInt64>!,
    _ inputScalarCnt: UInt32,
    _ inputStruct: UnsafeRawPointer!,
    _ inputStructCnt: Int,
    _ outputScalar: UnsafeMutablePointer<UInt64>!,
    _ outputScalarCnt: UnsafeMutablePointer<UInt32>!,
    _ outputStruct: UnsafeMutableRawPointer!,
    _ outputStructCnt: UnsafeMutablePointer<Int>!
) -> kern_return_t

// 异步方法调用(带完成端口)
func IOConnectCallAsyncMethod(...) -> kern_return_t
func IOConnectCallAsyncScalarMethod(...) -> kern_return_t
func IOConnectCallAsyncStructMethod(...) -> kern_return_t

// Trap 方法调用(0-6个参数,无结构体)
func IOConnectTrap0(_ connect: io_connect_t, _ index: UInt32) -> kern_return_t
func IOConnectTrap1(_ connect: io_connect_t, _ index: UInt32, _ p1: UInt) -> kern_return_t
// ... IOConnectTrap2 到 IOConnectTrap6(参数递增)

6.4 系统查询服务

// 授权服务
func IOServiceAuthorize(_ service: io_service_t, _ options: UInt32) -> kern_return_t

// 将服务作为文件描述符打开(返回 fd)
func IOServiceOpenAsFileDescriptor(_ service: io_service_t, _ options: Int32) -> Int32

6.5 URL 资源访问

// 从 URL 资源创建数据和属性
func IOURLCreateDataAndPropertiesFromResource(...) -> Bool

// 从 URL 资源创建属性
func IOURLCreatePropertyFromResource(...) -> Unmanaged<CFTypeRef>!

// 将数据和属性写入 URL 资源
func IOURLWriteDataAndPropertiesToResource(...) -> Bool

6.6 消息分发

// 从 mach 消息体获取通知回调参数
func OSGetNotificationFromMessage(
    _ msg: UnsafeMutablePointer<mach_msg_header_t>!,
    _ index: UInt32,
    _ type: UnsafeMutablePointer<UInt32>!,
    _ reference: UnsafeMutablePointer<UInt>!,
    _ content: UnsafeMutablePointer<UnsafeMutableRawPointer?>!,
    _ size: UnsafeMutablePointer<vm_size_t>!
) -> kern_return_t

七、IOKit Structures — 数据结构

7.1 通知结构

struct IOAsyncCompletionContent        // 异步完成通知内容
struct IOServiceInterestContent        // 服务关注通知内容 (32位)
struct IOServiceInterestContent64      // 服务关注通知内容 (64位)
struct OSNotificationHeader             // 通知消息头 (32位)
struct OSNotificationHeader64           // 通知消息头 (64位)

7.2 内存结构

struct IOPhysicalRange                 // 物理内存范围
struct IOVirtualRange                  // 虚拟内存范围

7.3 RPC 结构

struct IORPC                          // RPC 消息
struct IORPCMessage                   // RPC 消息体
struct IORPCMessageMach               // Mach RPC 消息
struct IORPCMessageErrorReturn        // RPC 错误返回
struct IORPCMessageErrorReturnContent // RPC 错误返回内容

7.4 其他结构

struct IONamedValue                   // 命名值
struct IOURLError                     // URL 错误
struct OSClassDescription            // 类描述
typealias IOCFPlugInInterface         // CF 插件接口体

八、IOKit Enumerations — 匿名枚举

Apple 文档中的 17 个匿名枚举包含了框架使用的各种选项和常量。以下是分类汇总:

8.1 注册表迭代选项

var kIORegistryIterateParents: Int      // 向父条目方向迭代
var kIORegistryIterateRecursively: Int  // 递归迭代

8.2 服务交互选项

var kIOServiceInteractionAllowed: Int   // 允许交互

8.3 异步回调引用参数

var kOSAsyncRefCount: Int            // 异步引用参数数量
var kOSAsyncRefSize: Int             // 异步引用大小(32位)
var kOSAsyncRef64Count: Int          // 异步引用参数数量(64位)
var kOSAsyncRef64Size: Int           // 异步引用大小(64位)
var kMaxAsyncArgs: Int               // 最大异步参数数

8.4 通知类型常量

var kFirstIOKitNotificationType: Int
var kIOAsyncCompletionNotificationType: Int    // 异步完成通知
var kIOServiceMatchedNotificationType: Int     // 服务匹配通知
var kIOServicePublishNotificationType: Int     // 服务发布通知
var kIOServiceTerminatedNotificationType: Int  // 服务终止通知
var kIOServiceMessageNotificationType: Int     // 服务消息通知
var kLastIOKitNotificationType: Int
var kIOKitNoticationTypeMask: Int              // 通知类型掩码
var kIOKitNoticationMsgSizeMask: Int           // 消息大小掩码
var kIOKitNoticationTypeSizeAdjShift: Int      // 大小调整移位

8.5 消息 ID

var kOSAsyncCompleteMessageID: Int     // 异步完成消息 ID
var kOSNotificationMessageID: Int      // 通知消息 ID

8.6 回调布局偏移索引

// 异步回调参数索引
var kIOAsyncCalloutFuncIndex: Int
var kIOAsyncCalloutRefconIndex: Int
var kIOAsyncReservedIndex: Int
var kIOAsyncCalloutCount: Int
var kIOAsyncReservedCount: Int

// Interest 回调参数索引
var kIOInterestCalloutFuncIndex: Int
var kIOInterestCalloutRefconIndex: Int
var kIOInterestCalloutServiceIndex: Int
var kIOInterestCalloutCount: Int

// 匹配回调参数索引
var kIOMatchingCalloutFuncIndex: Int
var kIOMatchingCalloutRefconIndex: Int
var kIOMatchingCalloutCount: Int

8.7 内存映射选项

var kIODefaultMemoryType: Int         // 默认内存类型
var kIOMapAnywhere: UInt32            // 任意位置映射
var kIOMapReadOnly: UInt32            // 只读
var kIOMapReference: UInt32           // 引用
var kIOMapUnique: UInt32              // 唯一
var kIOMapPrefault: UInt32            // 预分配
var kIOMapOverwrite: UInt32           // 覆盖
var kIOMapStatic: UInt32              // 静态
var kIOMapCacheMask: UInt32           // 缓存掩码
var kIOMapCacheShift: UInt32          // 缓存移位
var kIOMapUserOptionsMask: UInt32     // 用户选项掩码

8.8 缓存模式

var kIODefaultCache: Int              // 默认缓存
var kIOInhibitCache: Int              // 禁止缓存
var kIOWriteThruCache: Int            // 写穿缓存
var kIOWriteCombineCache: Int         // 写合并缓存
var kIOCopybackCache: Int             // 写回缓存
var kIOCopybackInnerCache: Int        // 内部写回缓存
// 内存映射别名:
var kIOMapDefaultCache: UInt32
var kIOMapInhibitCache: UInt32
var kIOMapWriteThruCache: UInt32
var kIOMapWriteCombineCache: UInt32
var kIOMapCopybackCache: UInt32
var kIOMapCopybackInnerCache: UInt32

8.9 其他枚举

var kIOConnectMethodVarOutputSize: Int    // 连接方法可变输出大小
var kIOCFSerializeToBinary: Int           // CF 序列化为二进制

九、IOKit Constants — 全局常量

9.1 系统内置值

var IOKIT: Int32                        // IOKit 定义常量
var IOPhysSize: Int32                   // 物理大小
var IO_OBJECT_NULL: io_object_t         // 空对象
let kIOMainPortDefault: mach_port_t     // 默认主端口

9.2 IOReturn 返回码

IOReturnkern_return_t 的别名,var kIOReturnSuccess: Int32 { get } 表示成功(值 = 0)。以下为常见错误码:

var kIOReturnSuccess: Int32            // 操作成功
var kIOReturnError: IOReturn           // 一般错误
var kIOReturnAborted: IOReturn         // 操作中止
var kIOReturnBadArgument: IOReturn     // 参数无效
var kIOReturnBadMedia: IOReturn        // 媒体损坏
var kIOReturnBadMessageID: IOReturn    // 消息 ID 无效
var kIOReturnBusy: IOReturn            // 设备忙
var kIOReturnCannotLock: IOReturn      // 无法锁定
var kIOReturnCannotWire: IOReturn      // 无法固定内存
var kIOReturnDMAError: IOReturn        // DMA 错误
var kIOReturnDeviceError: IOReturn     // 设备错误
var kIOReturnExclusiveAccess: IOReturn // 独占访问冲突
var kIOReturnInternalError: IOReturn   // 内部错误
var kIOReturnInvalid: IOReturn         // 无效
var kIOReturnIOError: IOReturn         // I/O 错误
var kIOReturnIPCError: IOReturn        // IPC 错误
var kIOReturnIsoTooNew: IOReturn       // 等时版本过新
var kIOReturnIsoTooOld: IOReturn       // 等时版本过旧
var kIOReturnLockedRead: IOReturn      // 读锁定
var kIOReturnLockedWrite: IOReturn     // 写锁定
var kIOReturnMessageTooLarge: IOReturn // 消息过大
var kIOReturnNoBandwidth: IOReturn     // 无带宽
var kIOReturnNoChannels: IOReturn      // 无通道
var kIOReturnNoCompletion: IOReturn    // 无完成
var kIOReturnNoDevice: IOReturn        // 无设备
var kIOReturnNoFrames: IOReturn        // 无帧
var kIOReturnNoInterrupt: IOReturn     // 无中断
var kIOReturnNoMedia: IOReturn         // 无媒体
var kIOReturnNoMemory: IOReturn        // 内存不足
var kIOReturnNoPower: IOReturn         // 无电源
var kIOReturnNoResources: IOReturn     // 资源不足
var kIOReturnNoSpace: IOReturn         // 空间不足
var kIOReturnNotAligned: IOReturn      // 未对齐
var kIOReturnNotAttached: IOReturn     // 未连接
var kIOReturnNotFound: IOReturn        // 未找到
var kIOReturnNotOpen: IOReturn         // 未打开
var kIOReturnNotPermitted: IOReturn    // 不允许
var kIOReturnNotPrivileged: IOReturn   // 权限不足
var kIOReturnNotReadable: IOReturn     // 不可读
var kIOReturnNotReady: IOReturn        // 未就绪
var kIOReturnNotResponding: IOReturn   // 无响应
var kIOReturnNotWritable: IOReturn     // 不可写
var kIOReturnOffline: IOReturn         // 离线
var kIOReturnOverrun: IOReturn         // 溢出
var kIOReturnPortExists: IOReturn      // 端口已存在
var kIOReturnRLDError: IOReturn        // RLD 错误
var kIOReturnStillOpen: IOReturn       // 仍打开
var kIOReturnTimeout: IOReturn         // 超时
var kIOReturnUnderrun: IOReturn        // 不足
var kIOReturnUnformattedMedia: IOReturn // 未格式化媒体
var kIOReturnUnsupported: IOReturn     // 不支持
var kIOReturnUnsupportedMode: IOReturn // 不支持的模式
var kIOReturnVMError: IOReturn         // 虚拟内存错误

9.3 注册表平面名称

var kIOServicePlane: String        // 服务平面
var kIODeviceTreePlane: String     // 设备树平面
var kIOPowerPlane: String          // 电源平面
var kIOUSBPlane: String            // USB 平面
var kIOFireWirePlane: String       // FireWire 平面
var kIOAudioPlane: String          // 音频平面

9.4 匹配键

var kIOClassKey: String                // 类名匹配
var kIONameMatchKey: String            // 名称匹配
var kIONameMatchedKey: String          // 名称已匹配(属性)
var kIOProviderClassKey: String        // 提供者类
var kIOPathMatchKey: String            // 路径匹配
var kIOLocationMatchKey: String        // 位置匹配
var kIOParentMatchKey: String          // 父条目匹配
var kIOPropertyMatchKey: String        // 属性匹配
var kIOResourceMatchKey: String        // 资源匹配
var kIOResourceMatchedKey: String      // 资源已匹配
var kIOPropertyExistsMatchKey: String  // 属性是否存在匹配
var kIOCompatibilityMatchKey: String   // 兼容性匹配

9.5 通知名称

var kIOFirstPublishNotification: String    // 首次发布通知
var kIOFirstMatchNotification: String      // 首次匹配通知
var kIOMatchedNotification: String         // 已匹配通知
var kIOPublishNotification: String         // 发布通知
var kIOTerminatedNotification: String      // 终止通知
var kIOWillTerminateNotification: String   // 即将终止通知

9.6 通用属性键

// BSD 设备信息
var kIOBSDNameKey: String          // BSD 设备名
var kIOBSDNamesKey: String         // BSD 设备名列表
var kIOBSDMajorKey: String         // BSD 主设备号
var kIOBSDMinorKey: String         // BSD 次设备号
var kIOBSDUnitKey: String          // BSD 单元号

// 启动设备
var kIOBootDeviceKey: String       // 启动设备
var kIOBootDevicePathKey: String   // 启动设备路径
var kIOBootDeviceSizeKey: String   // 启动设备大小

// Bundle 信息
var kIOBundleIdentifierKey: String              // Bundle ID
var kIOBundleNameKey: String                    // Bundle 名称
var kIOBundleVersionKey: String                 // Bundle 版本
var kIOBundleExecutableKey: String              // Bundle 可执行文件
var kIOBundleDevelopmentRegionKey: String       // 开发区域
var kIOBundleInfoDictionaryVersionKey: String   // Info.plist 版本
var kIOBundleResourceFileKey: String            // 资源文件

// 目录/构建
var kIOCatalogueKey: String           // 目录
var kIOKitBuildVersionKey: String     // IOKit 构建版本
var kIOKitDebugKey: String            // IOKit 调试
var kIOKitDiagnosticsKey: String      // IOKit 诊断
var kOSBuildVersionKey: String        // 操作系统构建版本

// 设备和图标
var kIODeviceIconKey: String          // 设备图标
var kIOIconKey: String                // 图标
var kIOBusBadgeKey: String            // 总线标识

9.7 服务匹配/属性键

var kIOProbeScoreKey: String             // 探测分数
var kIOMatchCategoryKey: String          // 匹配类别
var kIODefaultMatchCategoryKey: String   // 默认匹配类别
var kIOMatchedServiceCountKey: String    // 已匹配服务计数
var kIORegistryEntryIDKey: String        // 注册表条目 ID
var kIORegistryPlanesKey: String         // 注册表平面
var kIORegistryEntryPropertyKeysKey: String // 注册表条目属性键
var kIOResourcesClass: String            // 资源类
var kIOServiceClass: String              // 服务类
var kIOUserClientClassKey: String        // UserClient 类

9.8 用户客户端相关键

var kIOUserClientCrossEndianKey: String
var kIOUserClientCrossEndianCompatibleKey: String
var kIOUserClientSharedInstanceKey: String
var kIOUserClientCreatorKey: String
var kIOUserClientDefaultLockingKey: String
var kIOUserClientDefaultLockingSetPropertiesKey: String
var kIOUserClientDefaultLockingSingleThreadExternalMethodKey: String
var kIOUserClientEntitlementsKey: String

9.9 DriverKit 权限键 (macOS 11+)

var kIODEXTMatchCountKey: String
var kIODriverKitEntitlementKey: String
var kIODriverKitRequiredEntitlementsKey: String
var kIODriverKitHIDFamilyDeviceEntitlementKey: String
var kIODriverKitHIDFamilyEventServiceEntitlementKey: String
var kIODriverKitHIDTransportEntitlementKey: String
var kIODriverKitTestDriverEntitlementKey: String
var kIODriverKitTransportBuiltinEntitlementKey: String
var kIODriverKitUSBTransportEntitlementKey: String
var kIODriverKitUserClientEntitlementAdministratorKey: String
var kIODriverKitUserClientEntitlementAllowAnyKey: String
var kIODriverKitUserClientEntitlementAllowThirdPartyUserClientsKey: String
var kIODriverKitUserClientEntitlementCommunicatesWithDriversKey: String
var kIODriverKitUserClientEntitlementsKey: String

9.10 系统状态键

var kIOSystemStateClamshellKey: String
var kIOSystemStateHaltDescriptionKey: String
var kIOSystemStateHaltDescriptionHaltStateKey: String
var kIOSystemStatePowerSourceDescriptionKey: String
var kIOSystemStatePowerSourceDescriptionACAttachedKey: String
var kIOSystemStateSleepDescriptionKey: String
var kIOSystemStateSleepDescriptionHibernateStateKey: String
var kIOSystemStateSleepDescriptionReasonKey: String
var kIOSystemStateWakeDescriptionKey: String
var kIOSystemStateWakeDescriptionContinuousTimeOffsetKey: String
var kIOSystemStateWakeDescriptionWakeReasonKey: String

9.11 Interest 通知类型

var kIOGeneralInterest: String
var kIOBusyInterest: String
var kIOAppPowerStateInterest: String
var kIOPriorityPowerStateInterest: String

9.12 URL 错误常量

var kIOURLImproperArgumentsError: IOURLError
var kIOURLPropertyKeyUnavailableError: IOURLError
var kIOURLRemoteHostUnavailableError: IOURLError
var kIOURLResourceAccessViolationError: IOURLError
var kIOURLResourceNotFoundError: IOURLError
var kIOURLTimeoutError: IOURLError
var kIOURLUnknownError: IOURLError
var kIOURLUnknownPropertyKeyError: IOURLError
var kIOURLUnknownSchemeError: IOURLError

9.13 URL 属性键

var kIOURLFileDirectoryContents: String
var kIOURLFileExists: String
var kIOURLFileLastModificationTime: String
var kIOURLFileLength: String
var kIOURLFileOwnerID: String
var kIOURLFilePOSIXMode: String

9.14 NVRAM 相关键

var kIONVRAMDeletePropertyKey: String
var kIONVRAMDeletePropertyKeyWRet: String
var kIONVRAMSyncNowPropertyKey: String
var kIONVRAMActivateCSRConfigPropertyKey: String
var kIONVRAMBootArgsKey: String
var kIONVRAMReadAccessKey: String
var kIONVRAMWriteAccessKey: String
var kIONVRAMSystemAllowKey: String

9.15 其他杂项键

var kIOPlatformSerialNumberKey: String        // 平台序列号
var kIOPlatformUUIDKey: String                // 平台 UUID
var kIOPlatformDeviceMessageKey: String       // 平台设备消息
var kIODTNVRAMPanicInfoKey: String            // DT NVRAM 崩溃信息
var kIOCFPlugInTypesKey: String               // CF 插件类型
var kIOMapperIDKey: String                    // 映射器 ID
var kIOMinimumSegmentAlignmentByteCountKey: String
var kIOMaximumBlockCountReadKey: String
var kIOMaximumBlockCountWriteKey: String
var kIOMaximumByteCountReadKey: String
var kIOMaximumByteCountWriteKey: String
var kIOMaximumSegmentCountReadKey: String
var kIOMaximumSegmentCountWriteKey: String
var kIOMaximumSegmentByteCountReadKey: String
var kIOMaximumSegmentByteCountWriteKey: String
var kIOMaximumSegmentAddressableBitCountKey: String
var kIOMaximumPriorityCountKey: String
var kIOMinimumSaturationByteCountKey: String
var kIOMaximumSwapWriteKey: String
var kIOAllCPUInitializedKey: String
var kIOCompatibilityPropertiesKey: String
var kIOMatchDeferKey: String
var kIOMatchedPersonalityKey: String
var kIOPathKey: String
var kIORematchCountKey: String
var kIORematchPersonalityKey: String
var kIOResourcesSetPropertyKey: String
var kIOServiceDEXTEntitlementsKey: String
var kIOSupportedPropertiesKey: String
var kIOStateNotificationNameKey: String
var kIOStateNotificationEntitlementGetKey: String
var kIOStateNotificationEntitlementSetKey: String
var kIOStateNotificationItemCopyKey: String
var kIOStateNotificationItemCreateKey: String
var kIOStateNotificationItemSetKey: String
var kIOUserServerCDHashKey: String
var kIOUserServerClassKey: String
var kIOUserServerNameKey: String
var kIOUserServerOneProcessKey: String
var kIOUserServerPreserveUserspaceRebootKey: String
var kIOUserServerTagKey: String
var kIOUserServicePropertiesKey: String
var kIOUserUserClientKey: String
var kIOUserClassKey: String
var kIOUserClassesKey: String
var kIORegistryEntryAllowableSetPropertiesKey: String
var kIORegistryEntryDefaultLockingSetPropertiesKey: String
var kIOCommandPoolSizeKey: String
var PRIIOByteCount: String

十、示例:查找串口调制解调器

以下概述来自 Apple 示例代码 Communicating with a Modem on a Serial Port

流程概览

  1. 发现调制解调器:使用 IOServiceGetMatchingServices 配合 kIOSerialBSDServiceValue 查找串口设备,然后使用 kIOSerialBSDModemType 识别调制解调器
  2. 获取 BSD 路径:通过迭代器获取第一个可用调制解调器的正式 BSD 设备路径
  3. 打开串口:使用 POSIX open() 调用连接到 BSD 文件路径,保存串口当前状态以便后续恢复
  4. 初始化调制解调器:设置波特率、阻塞特性和握手信号,发送 AT 命令并读取响应
  5. 关闭串口:等待所有输出刷新,恢复串口原始状态,关闭文件描述符

十一、典型使用模式

11.1 查找并连接设备

import IOKit

// 创建主端口
var masterPort: mach_port_t = 0
IOMainPort(bootstrap_port, &masterPort)

// 创建匹配字典(匹配所有 IOUSBDevice 类设备)
guard let matchingDict = IOServiceMatching("IOUSBDevice")?
    .takeRetainedValue() as? [String: Any] else { return }

// 注册匹配通知
let notifyPort = IONotificationPortCreate(masterPort)
let runLoopSource = IONotificationPortGetRunLoopSource(notifyPort)?.takeRetainedValue()
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, .defaultMode)

var iterator: io_iterator_t = 0
let result = IOServiceAddMatchingNotification(
    notifyPort,
    kIOFirstMatchNotification,
    matchingDict as CFDictionary,
    { (refCon, iterator) in
        // 处理匹配的设备
        while case let device = IOIteratorNext(iterator), device != IO_OBJECT_NULL {
            // 处理 device
            IOObjectRelease(device)
        }
    },
    nil,
    &iterator
)

// 手动触发首次枚举
while case let device = IOIteratorNext(iterator), device != IO_OBJECT_NULL {
    // 处理已存在的设备
    IOObjectRelease(device)
}

// 运行循环
CFRunLoopRun()

11.2 遍历注册表

let rootEntry = IORegistryGetRootEntry(masterPort)

// 创建迭代器遍历服务平面
var iterator: io_iterator_t = 0
IORegistryCreateIterator(masterPort, kIOServicePlane, 0, &iterator)

var entry: io_registry_entry_t
repeat {
    entry = IOIteratorNext(iterator)
    if entry != IO_OBJECT_NULL {
        var name: [CChar] = Array(repeating: 0, count: 128)
        IORegistryEntryGetName(entry, &name)
        let nameStr = String(cString: name)
        print("注册表条目: \(nameStr)")
        IOObjectRelease(entry)
    }
} while entry != IO_OBJECT_NULL

11.3 与驱动通信(IOConnect)

// 打开连接
var connect: io_connect_t = 0
let kr = IOServiceOpen(service, mach_task_self_, 0, &connect)
guard kr == kIOReturnSuccess else { return }

// 调用驱动方法
var scalarOutput: UInt64 = 0
var outputCnt: UInt32 = 1
IOConnectCallScalarMethod(connect, 0, nil, 0, &scalarOutput, &outputCnt)

// 关闭连接
IOServiceClose(connect)

十二、与 DriverKit 的关系

  • IOKit 用于用户空间访问 IOKit 对象(发现设备、获取属性、注册通知)
  • DriverKit 用于创建在用户空间运行的设备驱动(macOS 11+ 和特定 iOS 版本)
  • 两者配合使用:DriverKit 创建驱动,IOKit 通过 IOServiceOpen 等函数与驱动通信
  • 对于 macOS 11+ 的新设备,应优先考虑使用 DriverKit 创建驱动

IOKit 常量中包含大量 kIODriverKit* 系列的权限键,用于配置 DriverKit 驱动的安全权限模型。


十三、参考链接


生成时间: 2026-05-29 文档版本: 基于 iOKit 框架最新文档 (iOS 16.0+, macOS 10.0+)