penghubingzhou 发表于 2021-12-11 13:51

【随手记】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 13:51

本帖最后由 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 13:51

本帖最后由 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 13:51

本帖最后由 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 参考思路

f4410367 发表于 2021-12-11 14:01

snycruntimepermisstion开启

penghubingzhou 发表于 2021-12-11 14:05

f4410367 发表于 2021-12-11 14:01 https://bbs.pcbeta.com/static/image/common/back.gif
snycruntimepermisstion开启

并不是这个的问题,我早就测试过了,而且目前我没有开启这个也正常引导了

小东i 发表于 2021-12-11 14:33

用MOD版也可以

penghubingzhou 发表于 2021-12-11 14:37

小东i 发表于 2021-12-11 14:33 https://bbs.pcbeta.com/static/image/common/back.gif
用MOD版也可以

mod版我没有测试,不过我个人不是特别爱用mod版

wangdongqq 发表于 2021-12-11 15:13

yundianwoniu 发表于 2021-12-12 11:00

本帖最后由 yundianwoniu 于 2021-12-12 11:02 编辑

yundianwoniu 发表于 2021-12-12 11:03

主要加入了如上补丁,076之前引导win不蓝屏,但076就不行了目前还没解决

shantou 发表于 2021-12-13 09:08

yundianwoniu 发表于 2021-12-12 11:03 https://bbs.pcbeta.com/static/image/common/back.gif
主要加入了如上补丁,076之前引导win不蓝屏,但076就不行了目前还没解决

这个补丁可以分享下吗 还有 snycruntimepermisstion要不要一起开启?谢谢

yundianwoniu 发表于 2021-12-14 08:18

shantou 发表于 2021-12-13 09:08 https://bbs.pcbeta.com/static/image/common/back.gif
这个补丁可以分享下吗 还有 snycruntimepermisstion要不要一起开启?谢谢

补丁在上面图片里啊

shantou 发表于 2021-12-14 10:24

yundianwoniu 发表于 2021-12-14 08:18 https://bbs.pcbeta.com/static/image/common/back.gif
补丁在上面图片里啊

晚上开启SnycRuntimePermission再输入这个补丁代码试试我的,谢谢

wslideshan 发表于 2021-12-14 12:16

win11蓝屏

penghubingzhou 发表于 2021-12-14 14:30

wangdongqq 发表于 2021-12-11 15:13 https://bbs.pcbeta.com/static/image/common/back.gif
所有ssdt都要加上osi的系统判断,否则当然会影响Windows的启动!oc对任何系统都是一视同仁,所以你的ssdt补 ...

确实是这样,但是就像三楼说的,有部分补丁像pnlf、rmne的 ,也确实不需要加入osi判断就能在win下用

penghubingzhou 发表于 2021-12-14 14:31

yundianwoniu 发表于 2021-12-12 11:03 https://bbs.pcbeta.com/static/image/common/back.gif
主要加入了如上补丁,076之前引导win不蓝屏,但076就不行了目前还没解决

我不太明白你为啥给pnlf重命名,正常的dsdt里都是没有pnlf的吧

penghubingzhou 发表于 2021-12-14 14:32

wslideshan 发表于 2021-12-14 12:16 https://bbs.pcbeta.com/static/image/common/back.gif
win11蓝屏

我没在win11试验过,但是bug10 和win7肯定是这样的

yundianwoniu 发表于 2021-12-19 09:45

penghubingzhou 发表于 2021-12-14 14:31 https://i.pcbeta.com/static/image/common/back.gif
我不太明白你为啥给pnlf重命名,正常的dsdt里都是没有pnlf的吧

没有背光补丁就没有亮度调节

penghubingzhou 发表于 2021-12-20 11:29

yundianwoniu 发表于 2021-12-19 09:45 https://i.pcbeta.com/static/image/common/back.gif
没有背光补丁就没有亮度调节

我知道,但正常的pnlf设备不需要重命名,因为正常的dsdt不会有这个设备,只要直接放pnlf的补丁就可以了
页: [1] 2
查看完整版本: 【随手记】oc进win7/bug10引导过程蓝屏的解决过程与方案手记