来源: 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 类型) |
IOKit 使用 opaque 类型引用内核对象,所有从函数获取的对象必须通过 IOObjectRelease() 释放。
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_t是io_object_t的别名。在内核中IOService是IORegistryEntry的子类,因此所有IORegistryEntryXXX函数都可以用于io_service_t。
typealias IONotificationPortRef = ... // 通知端口引用
typealias OSObjectRef = ... // OSObject 引用
typealias io_ident_t = ... // 对象标识符
typealias uext_object_t = ... // 用户空间扩展对象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 // 消息类型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 // 设备号typealias IODataQueueMemory // 数据队列头部映射结构体
typealias IODataQueueEntry // 数据队列条目
typealias IODataQueueAppendix // 数据队列附加区域映射结构体
typealias IOCFPlugInInterface // CF 插件接口
typealias OSAsyncReference // 异步回调引用(最大 kOSAsyncRefSize)
typealias OSAsyncReference64 // 64位异步回调引用// 增加引用计数
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// 获取 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>!IOKit 注册表是一个有向图,每个条目可以有多个父条目(跨不同平面)。常见平面包括 IOService、IODeviceTree、IOPower、IOUSB、IOAudio、IOFireWire。
// 获取注册表根条目
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// 获取迭代器中的下一个对象
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匹配字典是 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// 创建通知端口(用于接收设备变更通知)
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!
)通过 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// 获取所有 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// 获取 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// 服务匹配通知回调
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数据队列使用共享内存区域在用户空间和内核之间高效传递数据。
// 分配并返回一个新的 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// 将 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!// 为服务创建 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这些函数通过 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(参数递增)// 授权服务
func IOServiceAuthorize(_ service: io_service_t, _ options: UInt32) -> kern_return_t
// 将服务作为文件描述符打开(返回 fd)
func IOServiceOpenAsFileDescriptor(_ service: io_service_t, _ options: Int32) -> Int32// 从 URL 资源创建数据和属性
func IOURLCreateDataAndPropertiesFromResource(...) -> Bool
// 从 URL 资源创建属性
func IOURLCreatePropertyFromResource(...) -> Unmanaged<CFTypeRef>!
// 将数据和属性写入 URL 资源
func IOURLWriteDataAndPropertiesToResource(...) -> Bool// 从 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_tstruct IOAsyncCompletionContent // 异步完成通知内容
struct IOServiceInterestContent // 服务关注通知内容 (32位)
struct IOServiceInterestContent64 // 服务关注通知内容 (64位)
struct OSNotificationHeader // 通知消息头 (32位)
struct OSNotificationHeader64 // 通知消息头 (64位)struct IOPhysicalRange // 物理内存范围
struct IOVirtualRange // 虚拟内存范围struct IORPC // RPC 消息
struct IORPCMessage // RPC 消息体
struct IORPCMessageMach // Mach RPC 消息
struct IORPCMessageErrorReturn // RPC 错误返回
struct IORPCMessageErrorReturnContent // RPC 错误返回内容struct IONamedValue // 命名值
struct IOURLError // URL 错误
struct OSClassDescription // 类描述
typealias IOCFPlugInInterface // CF 插件接口体Apple 文档中的 17 个匿名枚举包含了框架使用的各种选项和常量。以下是分类汇总:
var kIORegistryIterateParents: Int // 向父条目方向迭代
var kIORegistryIterateRecursively: Int // 递归迭代var kIOServiceInteractionAllowed: Int // 允许交互var kOSAsyncRefCount: Int // 异步引用参数数量
var kOSAsyncRefSize: Int // 异步引用大小(32位)
var kOSAsyncRef64Count: Int // 异步引用参数数量(64位)
var kOSAsyncRef64Size: Int // 异步引用大小(64位)
var kMaxAsyncArgs: Int // 最大异步参数数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 // 大小调整移位var kOSAsyncCompleteMessageID: Int // 异步完成消息 ID
var kOSNotificationMessageID: Int // 通知消息 ID// 异步回调参数索引
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: Intvar 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 // 用户选项掩码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: UInt32var kIOConnectMethodVarOutputSize: Int // 连接方法可变输出大小
var kIOCFSerializeToBinary: Int // CF 序列化为二进制var IOKIT: Int32 // IOKit 定义常量
var IOPhysSize: Int32 // 物理大小
var IO_OBJECT_NULL: io_object_t // 空对象
let kIOMainPortDefault: mach_port_t // 默认主端口IOReturn 是 kern_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 // 虚拟内存错误var kIOServicePlane: String // 服务平面
var kIODeviceTreePlane: String // 设备树平面
var kIOPowerPlane: String // 电源平面
var kIOUSBPlane: String // USB 平面
var kIOFireWirePlane: String // FireWire 平面
var kIOAudioPlane: String // 音频平面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 // 兼容性匹配var kIOFirstPublishNotification: String // 首次发布通知
var kIOFirstMatchNotification: String // 首次匹配通知
var kIOMatchedNotification: String // 已匹配通知
var kIOPublishNotification: String // 发布通知
var kIOTerminatedNotification: String // 终止通知
var kIOWillTerminateNotification: String // 即将终止通知// 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 // 总线标识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 类var kIOUserClientCrossEndianKey: String
var kIOUserClientCrossEndianCompatibleKey: String
var kIOUserClientSharedInstanceKey: String
var kIOUserClientCreatorKey: String
var kIOUserClientDefaultLockingKey: String
var kIOUserClientDefaultLockingSetPropertiesKey: String
var kIOUserClientDefaultLockingSingleThreadExternalMethodKey: String
var kIOUserClientEntitlementsKey: Stringvar 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: Stringvar 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: Stringvar kIOGeneralInterest: String
var kIOBusyInterest: String
var kIOAppPowerStateInterest: String
var kIOPriorityPowerStateInterest: Stringvar 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: IOURLErrorvar kIOURLFileDirectoryContents: String
var kIOURLFileExists: String
var kIOURLFileLastModificationTime: String
var kIOURLFileLength: String
var kIOURLFileOwnerID: String
var kIOURLFilePOSIXMode: Stringvar kIONVRAMDeletePropertyKey: String
var kIONVRAMDeletePropertyKeyWRet: String
var kIONVRAMSyncNowPropertyKey: String
var kIONVRAMActivateCSRConfigPropertyKey: String
var kIONVRAMBootArgsKey: String
var kIONVRAMReadAccessKey: String
var kIONVRAMWriteAccessKey: String
var kIONVRAMSystemAllowKey: Stringvar 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。
- 发现调制解调器:使用
IOServiceGetMatchingServices配合kIOSerialBSDServiceValue查找串口设备,然后使用kIOSerialBSDModemType识别调制解调器 - 获取 BSD 路径:通过迭代器获取第一个可用调制解调器的正式 BSD 设备路径
- 打开串口:使用 POSIX
open()调用连接到 BSD 文件路径,保存串口当前状态以便后续恢复 - 初始化调制解调器:设置波特率、阻塞特性和握手信号,发送 AT 命令并读取响应
- 关闭串口:等待所有输出刷新,恢复串口原始状态,关闭文件描述符
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()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// 打开连接
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)- IOKit 用于用户空间访问 IOKit 对象(发现设备、获取属性、注册通知)
- DriverKit 用于创建在用户空间运行的设备驱动(macOS 11+ 和特定 iOS 版本)
- 两者配合使用:DriverKit 创建驱动,IOKit 通过
IOServiceOpen等函数与驱动通信 - 对于 macOS 11+ 的新设备,应优先考虑使用 DriverKit 创建驱动
IOKit 常量中包含大量 kIODriverKit* 系列的权限键,用于配置 DriverKit 驱动的安全权限模型。
- IOKit 主文档
- IOKitLib.h
- IODataQueueClient.h
- IOTypes.h User-Space
- IOKit Structures
- IOKit Enumerations
- IOKit Constants
- IOKit Functions
- IOKit Data Types
- Communicating with a Modem on a Serial Port
- IOKit Fundamentals
生成时间: 2026-05-29 文档版本: 基于 iOKit 框架最新文档 (iOS 16.0+, macOS 10.0+)