黑苹果系统如何仿冒显卡设备ID以驱动显卡?
黑苹果系统如何仿冒显卡设备ID以驱动显卡。今天给大家转载一篇技术帖!
macOS 的驱动是系统内置驱动,理论上,运行 macOS 的电脑只有苹果公司的 Mac 系列电脑,因此苹果公司不会为他们不使用的硬件开发驱动,没有特别原因也不会更新驱动。虽然也有第三方公司为它们的产品开发 macOS 专用的驱动,但这种情况仅常见于 WiFi/蓝牙/采集卡 等功能较为细分或其它专业设备,显卡是明确不在此列的。
所以,在 OpenCore/Clover 的设备属性(DeviceProperties)中,它们提供了仿冒设备 ID 的功能(Spoof Device ID)。设备ID(device-id)属性主要用于仿冒设备 id 从而驱动 macOS 原本不支持的设备,例如 HD4400 仿冒 HD4600;RX550 512SP 仿冒 RX550 640SP;再比如不支持的 ALC 声卡或英特尔网卡型号。
其原理是,macOS 的 IOKit 通过检测设备 ID 来决定哪些设备可以连接到哪个驱动文件,这些存放驱动的 kext 本身能支持的设备是很多的,但是苹果自己的驱动里包含的设备 ID 是有限的,因此指定 device-id 即可欺骗 IOKit ,让它加载对应的文件以驱动设备。「提示」可以这么做的前提就是存放驱动的 kext 本身能够支持设备,所以给 RTX3090 指定 RX 6900XT 的设备 ID 是没有用的。显卡设备 ID 有案例可以参考
0x67FF1002 就是 macOS 原生支持的 RX 550 640SP 的设备 ID,它位于 S/L/E 目录下的 kext 文件中
接着用 RX550 举例,苹果内置的驱动仅包括 Baffin 和 Polaris 核心 RX550 640SP 版的设备 ID:0x67FF1002,但同时 AMD 还用 Lexa 核心推出了 RX 550 512SP 的 0x699F1002 版本。由于设备 ID 和 macOS 内置的 ID 对不上号,导致无法驱动。
那为什么同一个显卡型号存在两种甚至三种不同的芯片型号?这里涉及一个 AMD 营销套路的小知识点,顺便说一下。
- 随着工艺制程和设计水平的提升,芯片集成的晶体管规模越来越大;
- 芯片制造存在良品率,晶体管规模越大工艺越新,良品率就越低,这是客观现实;
- 现在的 GPU 芯片动不动就上百亿晶体管规模,所以在制造的过程一部分晶体管造出来就是坏的,无法工作的;
完整的 Polaris21 和 Baffin 核心(主要对应 RX560)应该具有 1024 个流处理器(Stream Processor,SP),但在芯片制造的过程中,因良品率的关系产生了部分晶体管损坏的芯片,AMD 决定屏蔽损坏的部分,削减规格推出减配版本,于是 RX560D(896SP)和 RX550(640SP)就这么做出来了,AMD 历史上的很多产品都采用了这种操作。由于 RX560D 和 RX560 共用同一款 GPU 芯片(Polaris21/Baffin),所以部分 RX560D 可以通过“开核”来解锁本应被屏蔽的那部分晶体管,免费提升性能,也因此开核有一定的失败率。这个骚操作让 AMD 收回了成本,玩家得到了开盲盒的快乐,“开核”成功就是免费升级,大家都 Happy。
市面上的 RX550 有 Lexa,Baffin 和 Polaris 三种核心。其中 Polaris 是最少见的,笔者仅见过蓝宝石的一款;其次是 Baffin,这个比 Polaris 多,但也比较少见;到 2021 年以后,市面上日常出售的 RX550 有九成是 Lexa 核心,这款核心满血状态是 640SP,但目前常见款只有 512SP,整体规格也是入门级(128bit 带宽 + 2GB 显存)。
各个核心的技术规格,可以到 TechPowerUP 网站查看,信息非常全:
在矿潮的今天,有很多玩家卖掉了手里的中高端显卡,也有很多配了新机器苦等几月买不到心水显卡的玩家。这种情形下购买一款因无法挖矿而价格上涨不多,也能轻松买到的入门级显卡成为很多人的选择。
那么问题来了,AMD 不单单削减了上述变种卡的规格,还顺手赋予了它们一个全新的设备 ID。使用新设备 ID 在 Windows 中没有任何影响,因为 Windows 的显卡驱动由 AMD 控制和发布,而 macOS 驱动由苹果公司控制,AMD 不需要向苹果提交新设备的驱动,因为苹果自家的产品集成度非常高,并且除 Mac Pro 产品线之外的型号,显卡通常不能更换,是直接焊在主板上的,在整个产品生命周期中,基本没有更新驱动的理由。
以上,就是问题的前因后果。
1.首先确定设备 ID
查找和确定设备 ID 分为两个部分,第一个部分是确定你自己的设备 ID,第二个部分是确认 macOS 最接近的设备 ID
Windows 平台使用 GPU-Z,或在设备管理器中查看;macOS 平台下,点击系统信息报告即可
设备 ID 一般以以下的形式出现:
- 0x3E9B8086
- 0x67DF1002
- 0x13C010DE
0x 指的是十六进制;最后四位是供应商 ID(Vendor ID),Intel 是 8086;AMD/ATI 是 1002;NVIDIA 是 10DE;中间四位是确切的设备 ID,是我们需要的信息。
各家供应商的 PCI 设备 ID 信息可以通过以下几个数据库网站查询:http://pci-ids.ucw.cz
经过查询和确认,我们得到 RX550 512SP 的设备 ID 是 0x699F1002 ,这个设备 ID 对应的是 Radeon RX 540/540X/550/550X 。
2.macOS 支持的设备 ID
macOS 支持的设备 ID 可以从 macOS 的 /System/Library/Extensions/ 目录以下系统文件中查找:
- AMD7000Controller.kext: HD7XX0、R7 2XX、R9 2XX
- AMD8000Controller.kext: HD7XX0、R9 2XX、R7 3XX
- AMD9000Controller.kext: R9 2XX、R9 3XX
- AMD9500Controller.kext: WX4100/5100/7100、RX 460/470/480/550/560/570/580/590
- AMD10000Controller.kext: WX8100/9100、RX Vega 56/64
- AMDRadeonX5000.kext: Radeon VII
- AMDRadeonX6000.kext: W5500/5700、RX5500/5600/5700/XT、RX6800/6800XT/6900XT
或者,也可以从黑苹果星球整理好的表单中查找:
经过查询和确认,我们得到最接近 RX 550 512SP 的设备 ID 是 0x67FF1002,这个设备 ID 对应的是 Radeon RX550 640SP / RX560/560X 。
3.设备属性注入法
确定了设备 ID,下一步就是如何注入。方法一是通过 OpenCore/Clover 的注入设备属性(DeviceProperties)功能来仿冒,通过向指定的 PCI 路径为设备注入一些属性,达到仿冒设备 ID 以获得驱动的效果。下面是 RX550 512SP 仿冒 RX550 640SP 的例子:
- <key>PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)</key>
- <dict>
- <key>device-id</key>
- <data>/2cAAA==</data>
- <key>model</key>
- <string>Radeon RX 550</string>
- </dict>
注入的方法比较简单,在 config.plist 中添加以上内容就可以,ProperTree 用户确认自己的 Pci 路径后可直接复制粘贴。不明白的,看下面详细步骤:
首先从 Hackintool 获取设备的 PCI 路径:
如图所示复制 Device Path。
然后打开 OpenCore Configurator / Clover Configurator / OpenCoreAuxiliaryTools / ProperTree 编辑器,照图输入:
「注意」最后说明一下 0x67FF1002 是怎么变为 FF670000 的。具体来说是因为“大小端”(Endianness),解释起来太过复杂,感兴趣的同学可前往百度百科或 Wikipedia 查看。
- 第一步,0x67FF1002 删除前缀 0x,这部分代表十六进制,没有实际意义;
- 第二步,将 1002 后缀删除,这部分代表供应商 ID(Vendor-ID),在仿冒设备 ID 时没有实际意义;
- 第三步,剩余值按 大端 → 小端 的形式转换,具体来说就是两个一组分开,然后按从右到左的顺序重新排列,例如: <67 FF> → <FF 67>
- 最后,补全 8 位,得到 FF670000 。其它设备 ID 以此类推。
保存,重启即可生效。声卡,网卡的仿冒操作也是同理。
游客,如果您要查看本帖隐藏内容请回复
4.SSDT 方法
相比设备属性注入方法,SSDT 方法具有更高的执行优先级,整体稳定性和效率也要更高,但是使用起来有一点技术门槛。
首先第一步还是确定设备的路径,这里介绍 Windows 设备管理器和 IORegistryExplorer.app 两种查找方法,哪个对你来说方便,选哪个就行。
Windows 设备路径查找方法
进入 Windows 10,按下 Win + X 组合键,在弹出的菜单中打开“设备管理器”。找到你的独显,右键选择“属性”,然后切换到“详细信息”选项卡,在属性框中找到“位置路径”,如下图:
其中第二行的:
ACPI(_SB)#ACPI(PCI0)#ACPI(PEG1)#ACPI(PEGP)
这个部分就是我们需要的设备路径。另外,如果能直接在“属性”中找到“BIOS 设备名称”就更好了:
这里的 BIOS 设备路径是可以直接使用的 ACPI 路径。如果你的只有第一种,去掉其中的 #ACPI 和 括号,然后以英文 . 连接起来:
_SB.PCI0.PEG1.PEGP
macOS 设备路径查找方法
通常,我们使用 IORegistryExplorer.app 在 macOS 中来完成查找操作,但这个软件只支持 10.14 及以上的系统,所以使用 10.13.6 的同学只能使用 Windows 方法或自行转换 PCI 路径
如图,将路径中带 @ 符号的部分组合起来,即可得到设备路径,但由于 WhateverGreen.kext 会自动将独显修改为 GFX0,导致最终路径会不准确。
将提取到的路径信息保存下来.
5.修改预编译的 SSDT接下来需要使用 MaciASL.app ,这是一款用来编译 dsl 和 aml 文件的编译工具。使用软件打开黑苹果星球整理好的 .dsl 文件(注意看文件包说明选择文件)
将你在上一步中得到的路径替换下图中所示的位置:
22/5/1 22:32 上传
点击文件名下载附件
打开替换的过程中,最重要的一点是一个标点符号都不能错,例如,上图中要替换以下两个位置的路径信息(绿色标注):
External (_SB_.PCI0.PEG0.PEGP, DeviceObj)
Scope (_SB.PCI0.PEG0.PEGP)
替换完成后应该如下(仅举例,橙色标注):
External (_SB.PCI0.RP17.PXSX, DeviceObj)
Scope (_SB.PCI0.RP17.PXSX)
External (_SB_.PCI0.PEG0.PEGP, DeviceObj)
Scope (_SB.PCI0.PEG0.PEGP)
替换完成后应该如下(仅举例,橙色标注):
External (_SB.PCI0.RP17.PXSX, DeviceObj)
Scope (_SB.PCI0.RP17.PXSX)
第二点,关于 0x67FF1002 是怎么变为 FF670000 的。具体来说是因为“大小端”(Endianness),解释起来太过复杂,感兴趣的同学可前往百度百科或 Wikipedia 查看。
第一步,0x67FF1002 删除前缀 0x,这部分代表十六进制,没有实际意义;
第二步,将 1002 后缀删除,这部分代表供应商 ID(Vendor-ID),在仿冒设备 ID 时没有实际意义;
第三步,剩余值按 大端 → 小端 的形式转换,具体来说就是两个一组分开,然后按从右到左的顺序重新排列,例如: <67 FF> → <FF 67>
最后,补全 8 位,得到 FF670000 ,因此 Buffer(0x04) 中的值分别就是 0xFF, 0x67, 0x00, 0x00
其它设备 ID 以此类推。
添加到引导工具
R9 280:建议 0x679A1002 或 0x67981002
R9 380:建议 0x69381002 或 0x69391002
R9 270 / R9 370:建议 0x68101002
R7 240 / R7 340:建议 0x682B1002 或 0x665D1002
RX 550 512SP:建议 0x67FF1002
RX 640 Dell OEM:建议 0x67FF1002
RX 580 2048SP:建议 0x67DF1002
RX 590 GME:建议 0x67DF1002
HD Graphics 4400:建议 0x04128086
「注意」这里只是举例说明,不用照抄文件名。Clover 比较简单,先说 Clover。直接把文件放到以下路径:/EFI/Clover/ACPI/Patched/,重启即可见效。
OpenCore 用户把文件放到以下路径:/EFI/OC/ACPI/
然后编辑 config 文件,把文件添加到 ACPI 部分,并启用,见下图:
如果是 ProperTree,如下图:
保存重启即可见效。
6.需仿冒的显卡和 ID这里简单整理一下需要仿冒的显卡型号以及要仿冒的设备 ID,并未全部验证过,欢迎反馈。
R9 290 / R9 390:建议 0x67B01002R9 280:建议 0x679A1002 或 0x67981002
R9 380:建议 0x69381002 或 0x69391002
R9 270 / R9 370:建议 0x68101002
R7 240 / R7 340:建议 0x682B1002 或 0x665D1002
RX 550 512SP:建议 0x67FF1002
RX 640 Dell OEM:建议 0x67FF1002
RX 580 2048SP:建议 0x67DF1002
RX 590 GME:建议 0x67DF1002
HD Graphics 4400:建议 0x04128086
最后,部分显卡也有其它解法,例如 RX580 2048SP 和 RX590 GME,可以刷 VBIOS 变回直接免驱的型号。