Skip to content

驱动分层 ​

UniXNU 有三层驱动,分别运行在不同环境,构建和加载方式不同。

层运行环境构建产物加载方
UEFI 驱动UEFI boot servicesEDK II .efi固件 dispatch、UniXNU [[driver]] 或 kit
内置 XNU 驱动XNU 内核链接进内核的静态库内核启动时
kext 包XNU 内核,由 UEFI 暂存.kext 包实现协议的 XNU 加载器

选择层次 ​

需求层次
XNU 启动前可用的显示、输入或存储UEFI 驱动
XNU 内的平台专家、CPU、中断控制器、存储、显示或 GPU内置 XNU 驱动
由外部加载器在运行时校验并注入的包kext 包

UEFI 驱动可以为 UniXNU 菜单提供 framebuffer 和输入,也可以发布供其他 UEFI 驱动使用的协议。

内置 XNU 驱动可以使用完整内核 API,按实际 XNU 构建 ABI 编译,并强制链接进内核。

kext 包保持标准 bundle 布局。UniXNU 暂存 plist 和可执行文件并交给加载器,校验、依赖解析和注入由加载器负责。

匹配 ​

UEFI 驱动通过 UEFI driver model 绑定,或作为应用运行。

XNU 驱动通过 IOKitPersonalities 绑定。personality 指定 provider 类、驱动类、可选名称匹配和 probe 分数。

键含义
IOClass驱动类
IOProviderClassProvider 类
IONameMatchProvider 名称或 compatible 值
IOProbeScore分数越高越先 probe
IOMatchCategory允许第二个驱动匹配同一 provider
IOResourceMatch等待命名资源,例如 IOBSD

内置 personality 位于 iokit/KernelConfigTables.cpp,kext personality 位于 bundle 的 Info.plist。

设备树 ​

ADT 描述硬件。平台专家为每个 arm-io 子节点发布 nub。驱动从 provider 读取资源:

cpp
OSData *reg = OSDynamicCast(OSData, provider->getProperty("reg"));

compatible 属性用于选择驱动,IONameMatch 与 provider 名称比较。

驱动目录 ​

目录内容
drivers/<Name>内置 XNU 驱动源码和参考 Info.plist
kits/<Name>链接进驱动或内核的库
package/UniXNUPkg/DriverUEFI 驱动
package/UniXNUPkg/TestUEFI 测试驱动和负载

设备仓库可以覆盖其中任何目录。

下一步 ​

Released under the BSD-2-Clause-Patent License.