源码与补丁
UniXNU 从固定版本的 Apple 源码构建 XNU,并按名称顺序应用补丁。
源码
feeds.toml 固定源码:
| 源码 | tag | 用途 |
|---|---|---|
xnu | xnu-10063.141.1 | 内核源码 |
libplatform | libplatform-316.100.10 | 平台头文件 |
libdispatch | libdispatch-1477.100.9 | dispatch 头文件 |
AvailabilityVersions | AvailabilityVersions-141.1 | availability 宏 |
edk2 | release/202608 | package 和固件的 EDK II 基础 |
XNU 条目还包含:
toml
darwin = "23.6.0"
version = "10063.141.1"
driverkit_tag = "xnu-10063.121.3"
trustcache_tag = "xnu-8796.101.5"driverkit_tag 提供当前 tag 缺失的 iokit/DriverKit 头文件,trustcache_tag 提供 EXTERNAL_HEADERS/TrustCache。
补丁应用
scripts/build-xnu-4k-baseline.sh 对 .cache/xnu-work 应用补丁:
- 存在时反向应用两个后置补丁:
patches/xnu/zzz-boot-progress.patchpatches/xnu/zzy-native-gpu-addon-mount.patch
- 按名称顺序应用
patches/xnu/*.patch和kits/NativePrelink/patches/*.patch。 - 已应用的补丁跳过。
- 运行
prepare-xnu-source.py恢复缺失头文件。
后置补丁修改的区域与更早的补丁重叠,zzz 和 zzy 前缀让它们最后应用。反向步骤让新构建从这些区域的干净上下文开始。
补丁是幂等的:
sh
git -C .cache/xnu-work apply --reverse --check "$PATCH" && skip
git -C .cache/xnu-work apply --check "$PATCH"
git -C .cache/xnu-work apply "$PATCH"--check 在部分应用前停止构建。
补丁目录
| 目录 | 内容 |
|---|---|
patches/xnu/ | 内核补丁 |
patches/libpthread/ | 源码 pthread 补丁 |
patches/mesa/ | Turnip 和 Mesa 构建补丁 |
kits/NativePrelink/patches/ | 预链接 ABI 补丁 |
设备仓库可以加入 patches/ 模块,构建树把它链接到 tree/patches/,内核脚本读取 $ROOT/patches/xnu/*.patch,其中包含设备补丁。
新增补丁
- 构建一次内核,生成
.cache/xnu-work。 - 编辑
.cache/xnu-work中的源码。 - 生成补丁:
sh
git -C .cache/xnu-work diff -- <paths> > patches/xnu/my-change.patch- 再次运行
unixnu build kernel。
新增构建选项的补丁参考 native-aes-personality.patch:
c
#if defined(XNU_MY_OPTION) && XNU_MY_OPTION
" ,{"
" 'IOClass' = MyDriver;"
" 'IOProviderClass' = IOPlatformDevice;"
" }"
#endif对应的 -DXNU_MY_OPTION=1 来自内核脚本的 EXTRA_MAKE_ARGS。
构建开关
| 开关 | 值 |
|---|---|
SDKROOT | iphoneos |
ARCH_CONFIGS | ARM64 |
MACHINE_CONFIGS | BCM2837 |
KERNEL_CONFIGS | DEVELOPMENT |
ARM64_LINK_ADDR | 0xfffffff007004000 |
ARM64_PLKSEG_ADDR | 0xfffffff004004000 |
DEPLOYMENT_TARGET_FLAGS | -miphoneos-version-min=17.0 -DXNU_TARGET_OS_IOS |
BUILD_LTO | 0 |
BOUND_CHECKS | 0 |
BCM2837 携带 4 KiB 页布局。BUILD_LTO=0 保持目标文件和编译记录可读,并与外部静态库链接兼容。
defconfig 映射
每个 CONFIG_XNU_<NAME> 变成 XNU_<NAME>:
| defconfig 值 | 构建值 |
|---|---|
y | 1 |
n | 0 |
"text" | text |
123 | 123 |
字符串中的 {tree} | 构建树路径 |
内核脚本读取这些变量并加入目标文件开关、静态库和链接输入。
源码树
out/<board>/tree/
refer/xnu/ 固定源码
.cache/xnu-work/ 工作克隆
.cache/fakeroot/ 内核 SDK 根
.cache/sources/ 恢复头文件清单
build/xnu/ios-obj/ 目标文件和编译记录
build/xnu/ios-sym/ 符号
build/xnu/ios-dst/ 安装头文件
patches/xnu/ 链接的补丁
kits/NativePrelink/ 预链接工具和补丁更新源码
- 在
feeds.toml中设置新的ref和commit。 - 更新
darwin、version、driverkit_tag和trustcache_tag。 - 把补丁 rebase 到新 tag。
- 按新的编译记录重建设备静态库。
- 重建预链接并重新验证 kernelcache 固定。
预链接输出依赖原始 kernelcache ABI。新的源码版本可能需要新的 kernelcache 固定和 roots。