Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

搜索
查看: 19862|回复: 84

[其它] 关于OpenCore引导双系统的一些总结和讨论   [复制链接]

Rank: 2Rank: 2

UID
4609680
帖子
125
PB币
469
贡献
0
技术
1
活跃
640
发表于 2019-10-25 16:04:13 |显示全部楼层
本帖最后由 zhtengw 于 2019-10-25 20:58 编辑

最近OpenCore越发火热,越来越多人想要换用OC引导来得到更为原生的macOS体验。而使用OC引导,其对ACPI表的修改将会传递给操作系统,有些人就会发现OC引导的Windows会出现无法启动、容易崩溃、激活失效等等问题。其实,在配置OpenCore的时候,我们只要做好以下几个注意事项,这些问题都可以避免,在享受更原生macOS的同时,也能比较优雅地切换Windows系统。


1、谨慎使用ACPI Patch的改名

1) 不要改动_PRW _DSM和_OSI,前两个可能使硬件在Windows下工作不正常,而对_OSI的改动会使得Windows启动时蓝屏。另外,如KBD、GFX0等等,只要不是必须的,都尽量不去改名
2) 在ACPI Patch中所有改动了DSDT表中原始名称的,都应有相应的SSDT-xxx.aml重新实现原有名字的设备或函数,具体的就是一下第二部分的内容了。



2、自定义SSDT中应灵活应用’If (_OSI= (“Darwin”))’判断语句,使得改变后的功能只对macOS生效

1) 改名后重新实现的设备或函数,都要在内容里添加系统判断,如果是macOS,则使用改过的内容;如果不是macOS,则调用改名后的方法。
举个例子,很多笔记本会通过修改_Qxx函数的内容来实现在macOS下的亮度调节热键。这里以改动_Q15为例,首先在config.plist中会有一项改名:
Comment Find Replace
Change _Q15 to XQ15
5f513135 58513135
同时会有一个SSDT-key.aml重新写了一个_Q15函数,用以实现调节亮度的功能:  
  1. Method (_Q15, 0, NotSerialized)  // _Qxx: EC Query
  2. {
  3.             Notify (\_SB.PCI0.LPCB.KBD, 0x0405)
  4. }
复制代码
这就是说,原本的_Q15函数被改名为XQ15了,所有调用_Q15函数的都执行SSDT-key中定义的的新命令。
但此时通过OC引导重启到Windows的话,会发现这个热键失效了,因为Windows中原本要执行的命令现在是在XQ15函数中了。所以,我们修改SSDT-key.aml,判断系统为macOS时,才执行新的命令,否则调用XQ15,使得这个热键在macOS和Windows下都按我们预想的方式工作:
  1. Method (_Q15, 0, NotSerialized)  // _Qxx: EC Query
  2. {
  3.             If (_OSI ("Darwin"))
  4.             {
  5.                 Notify (\_SB.PCI0.LPCB.KBD, 0x0405)
  6.             }
  7.             Else
  8.             {
  9.                 \_SB.PCI0.LPCB.EC.XQ15 ()
  10.             }
  11. }
复制代码

2) SSDT中新添加的设备,应定义其_STA函数,用于判断它是否工作。
比如,很多笔记本会添加一个ALS0虚拟环境光传感器,用于保存屏幕亮度,SSDT-ALS0.aml:
  1. Device (_SB.ALS0)
  2. {
  3.         Name (_HID, "ACPI0008")  // _HID: Hardware ID
  4.         Name (_CID, "smc-als")  // _CID: Compatible ID
  5.         Name (_ALI, 0x012C)  // _ALI: Ambient Light Illuminance
  6.         Name (_ALR, Package (0x01)  // _ALR: Ambient Light Response
  7.         {
  8.             Package (0x02)
  9.             {
  10.                 0x64,
  11.                 0x012C
  12.             }
  13.         })
  14. }
复制代码
此时重启到Windows,你会发现设备管理器中也多出了一个传感器设备。这东西本来不应该出现在Windows中的,所以我们给ALS0设备定义_STA函数:
  1. Device (_SB.ALS0)
  2. {
  3.         Name (_HID, "ACPI0008")  // _HID: Hardware ID
  4.         Name (_CID, "smc-als")  // _CID: Compatible ID
  5.         Name (_ALI, 0x012C)  // _ALI: Ambient Light Illuminance
  6.         Name (_ALR, Package (0x01)  // _ALR: Ambient Light Response
  7.         {
  8.             Package (0x02)
  9.             {
  10.                 0x64,
  11.                 0x012C
  12.             }
  13.         })
  14.         Method (_STA, 0, NotSerialized)  // _STA: Status
  15.         {
  16.             If (_OSI ("Darwin"))
  17.             {
  18.                 Return (0x0F)
  19.             }
  20.             Else
  21.             {
  22.                 Return (Zero)
  23.             }
  24.         }
  25. }
复制代码
这样,ACPI只会告诉macOS系统有这么一个设备,而其他操作系统中完全找不到它的存在。



3、在OpenCore配置使用主板的UUID作为SystemUUID,以免破坏Windows的激活环境。

一般主板的UUID可以在BIOS中查看,如果BIOS中看不到,我们可以通过传统方式启动Windows(不能是OC引导),在命令行中查看。
打开cmd,输入wmic命令并回车,会看到提示符变成了 wmic:root\cli>,再输入命令csproduct list full,得到内容如下:
  1. C:\Users\Aten>wmic
  2. wmic:root\cli>csproduct list full

  3. Description=Computer System Product
  4. IdentifyingNumber=Default string
  5. Name=MS-7B23
  6. SKUNumber=
  7. UUID=00000000-0000-0000-0000-309C23AE5B3E
  8. Vendor=Micro-Star International Co., Ltd.
  9. Version=1.0
复制代码
将这个UUID填入config.plist中的 Platforminfo->Generic->SystemUUID 即可。以上Windows中的查看方式也可以在配置好OpenCore引导后作为验证。



4、如果Windows安装在另外一块硬盘,确保该硬盘的EFI分区是第一个分区。

有些电脑出厂时硬盘的第一个分区是恢复分区,或者用别的引导工具安装Windows后在该硬盘没有建立ESP分区,这会导致OpenCore找不到Windows系统。此时只要调整硬盘分区,新建或移动ESP到该硬盘的第一分区即可,推荐在winPE下用DiskGenius操作。


总结:
就我看来,只要做到以上几点,OpenCore引导的双系统就比较有舒服的体验了。但是这些东西可能对于已经配置好了clover,想要转用OpenCore的人比较有帮助,而那些从头开始配置OpenCore的同志们,直接参考小兵GitHub中的OC-little可能会省事一点,因为里面的SSDT都已经做好了系统判断。个人水平有限,肯定有疏漏和错误,望大家多讨论交流。



扩展内容:
1、关于_OSI函数
_OSI函数是用于询问操作系统名称的,因为硬件厂商可能会在ACPI表中规定一些功能只在某些操作系统实现,以回避bug之类,而同时,操作系统也可以伪造回答,以规避bug或实现更多功能。

2、关于_STA函数
_STA用于描述设备的状态。ACPI表中的每个设备,在初始化之前,都会先执行_STA函数,去检测这个设备的状态,如果设备存在才初始化。如果没有显式定义_STA函数,这个设备则被默认是存在且能正常工作的。描述设备的状态主要靠_STA的返回值,它的返回值有32位,但目前只有末5位有定义:
位数 31:5 4 3 2 1 0
定义 未使用 是否有电池 是否正常工作 是否在UI中显示 是否激活并解码资源 是否存在
对以上定义,“是”则置该位为1,“否”则置为0。如果一个设备,没有电池,可以正常工作并在系统中显示,那它的_STA返回值就是二进制的01111,换成16进制就是0x0F,如果一个设备不存在,那返回值就是00000,即16进制0x00。

知道了_OSI和_STA的意义,我们便可以理解上面的自定义的_STA函数了。ACPI首先询问操作系统,你是不是Darwin内核,系统回答是,那么ACPI就得到_STA为0x0F,开始正常初始化设备;如果系统回答不是,那么_STA返回0x00,ACPI就会忽略这个设备,之后系统中也看不到这个设备了。
  1. Method (_STA, 0, NotSerialized)  // _STA: Status
  2. {
  3.             If (_OSI ("Darwin"))
  4.             {
  5.                 Return (0x0F)
  6.             }
  7.             Else
  8.             {
  9.                 Return (Zero)
  10.             }
  11. }
复制代码


参考资料:
1、OpenCore Configuration.pdf
2、ACPI规范
3、精解OpenCore-黑果小兵
8

查看全部评分

Rank: 5Rank: 5Rank: 5

UID
728481
帖子
562
PB币
110
贡献
0
技术
0
活跃
1780
发表于 2019-10-25 17:04:10 |显示全部楼层
好贴!  请教一下楼主 OpenCore引导   config.plist—–DeviceProperties—–Block   如何禁用MATS、DMAR、BGRT? 使用OpenCore引导卡在 MACH Reboot

Rank: 2Rank: 2

UID
4609680
帖子
125
PB币
469
贡献
0
技术
1
活跃
640
发表于 2019-10-25 18:03:00 |显示全部楼层
xtwz 发表于 2019-10-25 17:04
好贴!  请教一下楼主 OpenCore引导   config.plist—–DeviceProperties—–Block   如何禁用MATS、DMAR、 ...

你这应该是在ACPI-Block里写吧。可以试试这样:
All YES
Comment Drop MATS
Enabled YES
OemTableId <0000000000000000>
TableLength 0
TableSignature <4D415453>


All YES
Comment  Drop DMAR
Enabled YES
OemTableId  <0000000000000000>
TableLength 0
TableSignature <444D4152>


这里TableSignature是你要禁用的表名对应的16进制子串,可以用HackinTool转换。

我没用过ACPI table Drop,不清楚行不行。你可以试试。

Rank: 7Rank: 7Rank: 7

UID
776414
帖子
1238
PB币
1504
贡献
0
技术
0
活跃
663
发表于 2019-10-25 19:40:02 |显示全部楼层
厉害了,感谢分享

Rank: 5Rank: 5Rank: 5

UID
4832942
帖子
584
PB币
627
贡献
0
技术
0
活跃
506
发表于 2019-10-25 20:02:34 |显示全部楼层
新的引导没用过

Rank: 5Rank: 5Rank: 5

UID
567847
帖子
845
PB币
3346
贡献
0
技术
73
活跃
1598
发表于 2019-10-25 20:07:30 |显示全部楼层
其实不是必须的都不要改名。

Rank: 2Rank: 2

UID
2741716
帖子
483
PB币
0
贡献
0
技术
0
活跃
346
发表于 2019-10-25 20:08:46 |显示全部楼层
感谢,但是不想折腾了·

UID
4848855
帖子
567
PB币
2470
贡献
0
技术
22
活跃
964
发表于 2019-10-25 20:19:52 |显示全部楼层
zhtengw 发表于 2019-10-25 18:03
你这应该是在ACPI-Block里写吧。可以试试这样:

不要在oc下drop这两张表,尽量有dart=0

UID
4848855
帖子
567
PB币
2470
贡献
0
技术
22
活跃
964
发表于 2019-10-25 20:20:36 |显示全部楼层
写的不错,oc请不要用改名,用ssdt并做系统判断

Rank: 7Rank: 7Rank: 7

UID
4583288
帖子
2143
PB币
1579
贡献
0
技术
0
活跃
2087
发表于 2019-10-25 20:24:36 |显示全部楼层
优秀文章,感谢分享!

Rank: 2Rank: 2

UID
4609680
帖子
125
PB币
469
贡献
0
技术
1
活跃
640
发表于 2019-10-25 20:37:44 |显示全部楼层
xjn819 发表于 2019-10-25 20:19
不要在oc下drop这两张表,尽量有dart=0

感谢,因为我不知道如何解决他的卡住问题,所以只好直接回答他如何禁用ACPI表了。

Rank: 2Rank: 2

UID
4609680
帖子
125
PB币
469
贡献
0
技术
1
活跃
640
发表于 2019-10-25 20:41:00 |显示全部楼层
xjn819 发表于 2019-10-25 20:20
写的不错,oc请不要用改名,用ssdt并做系统判断

是的,我有强调尽量不要改名。但有些情况不改名没办法。比如thinkpad的亮度热键,它只响应EC._Qxx事件,没有PS2 code和ADB code,就没法用PS2-ADB映射的方式来工作,只能通过改名重新定义的方式实现功能。

Rank: 2Rank: 2

UID
4609680
帖子
125
PB币
469
贡献
0
技术
1
活跃
640
发表于 2019-10-26 09:14:30 |显示全部楼层
yusanxing 发表于 2019-10-25 20:07
其实不是必须的都不要改名。

恩,我有写,现在标红了

Rank: 7Rank: 7Rank: 7

UID
4856880
帖子
1436
PB币
1885
贡献
0
技术
0
活跃
893
发表于 2019-10-26 09:31:37 |显示全部楼层
进来学习一下

Rank: 7Rank: 7Rank: 7

UID
876573
帖子
2778
PB币
2365
贡献
0
技术
0
活跃
1738
发表于 2019-10-26 10:30:16 |显示全部楼层
昨天专用OC也遇到这个问题了,第一时间看到兄弟的发帖就用次方法修复了,真的非常好,昨天不知什么情况这贴又在审核,今天终于解放了,赶紧复制保存,以备不时之需。

Rank: 2Rank: 2

UID
4609680
帖子
125
PB币
469
贡献
0
技术
1
活跃
640
发表于 2019-10-26 10:38:01 |显示全部楼层
415793633 发表于 2019-10-26 10:30
昨天专用OC也遇到这个问题了,第一时间看到兄弟的发帖就用次方法修复了,真的非常好,昨天不知什么情况这贴 ...

谢谢,能帮到你真是太好了。

Rank: 5Rank: 5Rank: 5

UID
728481
帖子
562
PB币
110
贡献
0
技术
0
活跃
1780
发表于 2019-10-26 11:49:03 |显示全部楼层
zhtengw 发表于 2019-10-25 18:03
你这应该是在ACPI-Block里写吧。可以试试这样:

非常感谢 楼主的回复……感谢感谢

Rank: 2Rank: 2

UID
4609680
帖子
125
PB币
469
贡献
0
技术
1
活跃
640
发表于 2019-10-26 11:58:04 |显示全部楼层
xtwz 发表于 2019-10-26 11:49
非常感谢 楼主的回复……感谢感谢

不好意思,昨天每次修改和回复都要被审核好久,没能跟你及时交流讨论。

UID
4848855
帖子
567
PB币
2470
贡献
0
技术
22
活跃
964
发表于 2019-10-26 18:31:32 来自手机 |显示全部楼层
zhtengw 发表于 2019-10-25 20:37
感谢,因为我不知道如何解决他的卡住问题,所以只好直接回答他如何禁用ACPI表了。

嗯,你也知道oc只用一张acpi表,你在config里drop表的话,用oc引导的win也会把这张表drop掉,所以win会出问题,所以使用dart=0更好,作用等同

Rank: 5Rank: 5Rank: 5

UID
4199986
帖子
1003
PB币
634
贡献
0
技术
0
活跃
1678
发表于 2019-10-29 17:07:15 |显示全部楼层
_dsm怎么改才是比较很科学的,像我的XHCI原生已经有_DSM,想改下。
关闭

站长推荐

2020 CTIC网络安全分析与情报大会将于10/21线上开幕,距报名结束还有5天,抓紧时间上车 ...
扫描二维码, 关注官方服务号“微步在线”,参与活动即可领取丰厚奖品
回顶部
Copyright (C) 2005-2020 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛 | 电脑硬件 | 安卓软件