2026年9月15日 星期二 猫川漫记

猫川漫记

Lonely journey of a cat.

寻宝记

寻宝记:华果山吗喽王(或:我是如何爱上在华为机器上启动 macOS 的)

之前看到 https://x.com/imbushuo/status/2094320052245762342 在 CIX O6 上启动 KVM 加速的虚拟 macOS,看了一下,手头的华为擎云机器也符合硬件标准(支持 16K 页面虚拟化,有完整 PAuth 支持,支持 DIT, UAO, SSBS, SHA3 等特性),于是就想在华为机器上跑起来 macOS,进行一个站中间串两边的纵横家表演,不觉得节目效果会很好吗?

于是就去咨询了“著名国外黑客”我不说先生,看到了 steelbrain 的这个项目,于是拉回本地。但是,华为信创线的机器使用的是过于老旧的基于 AOSP 内核修改的 5.10,而且还没有源码,很难把项目中的几个补丁应用进去,还好这台机器的内核开了 KALLSYMS,能够比较简单的通过 kprobe 做一些修补。

第一难:华为怎么这么坏啊

华为的雷霆 CPU 开始就给我来了一点中国震撼:众所周知信创线的机器的核心是手机/平板的降级片,特性支持应该是一样的。但是呢,手机端的 CPU 支持 paca pacg 特性,信创线的机器反倒没有。于是插了一个 Kernel Module 查看 ID_AA64ISAR1_EL1 ,发现特性寄存器里真的没有,但想了一晚上,还是感觉不对,同样的芯片不至于抽象到功能集合不一样,于是进行了二番战:无视风险继续安装。结果发现这个芯片实际上有指针签名特性,只是故意熔断了特性寄存器,华为怎么这么坏啊。

由于机器硬件特性寄存器给这个功能屏蔽了,外加华为厂商内核配置 CONFIG_ARM64_PTR_AUTH=n,需要对 KVM 打补丁,恢复 KVM 对 PAuth 相关寄存器的状态保存及恢复功能,直接简简单单让电子牛马增加一个 kprobe 挂在 kvm_arch_vcpu_ioctl_run,覆盖特性寄存器的同时恢复寄存器保存恢复功能。

第二难:苹果风味 ARM

ARM 标准的 PAuth 修复以后,XNU 内核可以启动,但启动到 launchd 之后还会发生 PAuth 导致的 Panic,仔细查看上游仓库后发现,由于该仓库是针对运行在 mac 上的 Asahi 设计的,而 Mac 相对普通设备有两个额外寄存器:APCTLKERNKEY,前者控制是否开启 PAuth 用户/内核态隔离模式,后者是一个苹果特有的 PAuth 密钥派生控制器:在 ASi 硬件下,内核态使用裸的 A/B 密钥,而用户态的 A/B 密钥通过内核态密钥和 KERNKEY 一起进行派生得到(参考上游仓库和 m1n1 仓库内容),显然“标准 ARM”设备上没有这个功能,因此需要对这个派生功能进行屏蔽。由于苹果 vmapple 内核通过 HVC 设置密钥,因此我们要对上游的 HVC Handler 进行修改,把应用逐个进程密钥的功能进行屏蔽。

顺带一提,由于厂商内核太老,还需要一个额外的内核模块模拟 Normalize cache configuration 这个 6.3 引入的 kvm 虚拟化缓存布局的行为/

开始运行

不过,在开始你的红苹果之旅之前,你还得先有(或者借到)一台 Mac,对虚拟机进行预先的 Provision 操作。首先你得先拿到一个 ipsw 或者真机,从中提取 AVPBooter.vmapple2.bin,之后用 macosvm 在真机上 Provision 一个准备好的虚拟机,然后把机器发送到你的宿主机上,并插入合适的 Kernel Module。(此处请参考上游仓库)。

完工

顺带一提:由于 Reims VGPU 驱动质量和我们最爱的马良 GPU 驱动都差不多垃圾,所以 15 以上的 macOS 启动会遇到问题,我不说先生有个更新版本的可以处理,请大家等待他发布。内核模块不发布是因为不同版本内核偏移量不一定一致,稍晚看一下怎么做成通用的再发,要不试试把本文传给你的电子许愿机看看能不能做一个出来? 9000x 和 9001x 设备保证可以跑,9000c 的可能不行,我手头没有设备无法测试。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注