【随手记】oc进win7/bug10引导过程蓝屏的解决过程与方案手记
本帖最后由 penghubingzhou 于 2021-12-11 14:39 编辑好久没有来论坛写帖子了,算算从搞毕设到现在正式就职,也很久没有发表一些分享帖了,今天就随手记下我在升级潮7000 EFI时解决某个问题的过程吧,供大家参考和讨论。大家都可以在我的帖子下面回复你们的看法和心得。理性交流,不要引战,文明用语,争做文明坛友。
事情是这样的,在潮7000 OC EFI里遗留了一个非常久远的问题:我的潮7000在引导win7/bug10的时候会发生蓝屏问题,具体来说就是会显示ACPIxxx(具体内容我也记不清了,但基本就是告诉我是ACPI的错误)。有关这个错误的问题,大概在两年前OC预制变量法刚出来的时候,我曾经与@Bat.bat同学讨论过,他跟我说可能与ACPI没有预制变量SSDT有关系。但是当时我在把能想到的SSDT都做过预制变量之后,仍然存在这个问题。我百思不得其解,这个问题也就这么留着两年多。虽然这个问题并不影响我启动win7(从BIOS直接引导),但这样来说,仍然不算很方便。
今天,当我将我EFI的版本升级到0.7.6时,我的升级过程不是特别顺利,我的nvme无法识别。为了排除故障,我借用了@yippeeghost这位坛友的EFI里的config文件(https://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1911901&highlight=0.7.6)进行排查故障的时候,我竟然有了意外的收获。当我尝试使用该坛友的config文件引导win7时,奇迹居然出现了,win7居然成功被引导了,这是什么问题呢?我没有放弃这个敏感的点,开始了我的研究。
本帖最后由 penghubingzhou 于 2021-12-11 14:05 编辑
众所周知,NUC8是一个mini台式主机,具有类似台式机安装的特性之一:不需要改写大量的DSDT代码。这位同学的EFI也是这样,里面仅有两个修正过的SSDT文件加载:
观察这两个SSDT,我发现它的绝大多数代码都是使用darwin括弧修正过的:
联想到bat跟我说过的话,我当时做出了一个大胆的猜测:是否是因为我的SSDT里面存在的某些修正,在OC引导时被OC注入到win内,与win产生了冲突,从而导致了OC引导win出现蓝屏问题。带着这个疑问,我开始进行了尝试。
本帖最后由 penghubingzhou 于 2021-12-11 14:28 编辑
为了验证我的想法,首先,我在OC的ACPI界面,去掉了我所有加入的SSDT修正,然后重启。奇迹出现了,win7完全正常引导,没有出现任何问题。这个实验的成功初步验证了我的想法,就是我的问题出在了SSDT修正里。
接下来,我还需要验证另一个方面的问题,就是加入darwin括弧是否可以解决问题。我找到了我EFI下的SSDT-PNLF文件测试,对文件修改如下:
DefinitionBlock ("", "SSDT", 2, "ACDT", "_PNLF", 0x00000000){ External (_SB_.PCI0.GFX0, DeviceObj) // (from opcode) External (RMCF.BKLT, IntObj) // (from opcode) External (RMCF.FBTP, IntObj) // (from opcode) External (RMCF.GRAN, IntObj) // (from opcode) External (RMCF.LEVW, IntObj) // (from opcode) External (RMCF.LMAX, IntObj) // (from opcode)
If (_OSI ("Darwin")) { ... // 原有代码 }}
保存,并在配置文件的ACPI里勾选它,重启,进入win,一切似乎都是那么顺理成章,win7成功启动了。到这里,我似乎觉得问题已经得到了解决,为了保险,我将PNLF文件还原了回去,去win7下重启试验。奇怪,win7仍然是正常启动了,这到底是怎么回事呢?
我仔细思考了下刚才的启动过程,在出现“正在启动Windows”这个界面时出现了一个小细节:正常win7在这里不会有什么异常,但是刚才的启动,这里卡顿黑屏了一下,然后又显示了一次“正在启动Windows”,然后进入了桌面。联想到PNLF与显卡亮度有关,我突然想到,也许PNLF不具有代表性,毕竟win可能用不到这个设备。那么我就需要多找几个DSDT作参考。
在这个思路的指引下,我又勾选了SSDT-EC、SSDT-DGPU这两个文件继续进行测试,这次又复现了之前的故障,然后,我分别改写这两个文件的代码:
DefinitionBlock ("", "SSDT", 2, "ACDT", "AddOn", 0x00000000){ External (_SB_.PCI0, DeviceObj) // (from opcode) External (_SB_.PCI0.LPCB, DeviceObj) // (from opcode)
If (_OSI ("Darwin")) { Scope (\_SB.PCI0) { ...... //原有代码 } }
DefinitionBlock ("", "SSDT", 2, "ACDT", "spoof", 0x00000000){ If (_OSI ("Darwin")) { If (CondRefOf (\_SB.PCI0.PEG0.PEGP._OFF)) { ...... //原有代码 } }}
重启测试,这一次,win7顺利启动,没再出现任何问题。到此我断定,darwin括弧就是解决这个问题的关键。
不过到这里,问题还不算完。在测试SSDT-Fnkey(亮度调节快捷键)这个文件时,我发现虽然在win7下它不存在问题了,但是进入到黑果之后,它居然发生了五国问题。这个方法的代码非常简单,并且存在替代品(Brightess.kext),我简单地把它从我的EFI里去掉,修正了这个问题。
经过这一连串的排查与解决,我成功地对所有的SSDT进行了适配,最终成功从OC引导了win。
本帖最后由 penghubingzhou 于 2021-12-11 14:42 编辑
总结下来,我这次解决的问题具有如下明显特征:
1、从OC引导win时发生的问题
2、引导时发生了蓝屏并且明显提示了ACPIxxx的问题
针对这个问题的修正方法也十分明确:使用darwin括弧来在win下屏蔽掉黑果的修正代码。
if (_OSI"Darwin"){ ...... //原有代码}
另外在测试中,我还发现了一些特殊的SSDT不需要使用这个方式来屏蔽。比如SSDT-RMNE(Rehabman提供的仿冒内置网卡SSDT)、SSDT-PNLF(亮度调节)这样的SSDT,因为修正过的代码对win影响很小,因此无需采用此法修正。再比如SSDT-TPAD(触摸板),因为已经采用预制变量法做过修正,因此也无需采用此法来修正。
目前暂时记录这么多,后续如果发现其他问题再补充。
鸣谢
@Bat.bat 思路参考
@宪武OC SSDT预制变量法
@yippeeghost 参考思路
snycruntimepermisstion开启 f4410367 发表于 2021-12-11 14:01 https://bbs.pcbeta.com/static/image/common/back.gif
snycruntimepermisstion开启
并不是这个的问题,我早就测试过了,而且目前我没有开启这个也正常引导了 用MOD版也可以 小东i 发表于 2021-12-11 14:33 https://bbs.pcbeta.com/static/image/common/back.gif
用MOD版也可以
mod版我没有测试,不过我个人不是特别爱用mod版 本帖最后由 yundianwoniu 于 2021-12-12 11:02 编辑
主要加入了如上补丁,076之前引导win不蓝屏,但076就不行了目前还没解决 yundianwoniu 发表于 2021-12-12 11:03 https://bbs.pcbeta.com/static/image/common/back.gif
主要加入了如上补丁,076之前引导win不蓝屏,但076就不行了目前还没解决
这个补丁可以分享下吗 还有 snycruntimepermisstion要不要一起开启?谢谢 shantou 发表于 2021-12-13 09:08 https://bbs.pcbeta.com/static/image/common/back.gif
这个补丁可以分享下吗 还有 snycruntimepermisstion要不要一起开启?谢谢
补丁在上面图片里啊 yundianwoniu 发表于 2021-12-14 08:18 https://bbs.pcbeta.com/static/image/common/back.gif
补丁在上面图片里啊
晚上开启SnycRuntimePermission再输入这个补丁代码试试我的,谢谢 win11蓝屏 wangdongqq 发表于 2021-12-11 15:13 https://bbs.pcbeta.com/static/image/common/back.gif
所有ssdt都要加上osi的系统判断,否则当然会影响Windows的启动!oc对任何系统都是一视同仁,所以你的ssdt补 ...
确实是这样,但是就像三楼说的,有部分补丁像pnlf、rmne的 ,也确实不需要加入osi判断就能在win下用 yundianwoniu 发表于 2021-12-12 11:03 https://bbs.pcbeta.com/static/image/common/back.gif
主要加入了如上补丁,076之前引导win不蓝屏,但076就不行了目前还没解决
我不太明白你为啥给pnlf重命名,正常的dsdt里都是没有pnlf的吧 wslideshan 发表于 2021-12-14 12:16 https://bbs.pcbeta.com/static/image/common/back.gif
win11蓝屏
我没在win11试验过,但是bug10 和win7肯定是这样的 penghubingzhou 发表于 2021-12-14 14:31 https://i.pcbeta.com/static/image/common/back.gif
我不太明白你为啥给pnlf重命名,正常的dsdt里都是没有pnlf的吧
没有背光补丁就没有亮度调节 yundianwoniu 发表于 2021-12-19 09:45 https://i.pcbeta.com/static/image/common/back.gif
没有背光补丁就没有亮度调节
我知道,但正常的pnlf设备不需要重命名,因为正常的dsdt不会有这个设备,只要直接放pnlf的补丁就可以了
页:
[1]
2