为了验证我的想法,首先,我在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。 |