
CPU : i7 4790K
主板:华硕Z97
显卡:影驰GTX970
内存:十铨 2400 16G
硬盘:普通机械硬盘(三星固态装windows没用到)
一、安装10.13.1系统
之前有安装10.13,但是显卡驱动打不上,然后尝试安装10.13.1,侥幸成功了。
1、准备一个16G的u盘,用于制作启动盘(建议用USB3.0的,2.0的太慢了,我的做了半个小时)
2、从AppStore下载macOS High Sierra镜像(没有mac系统条件可以去远景、黑苹果等论坛里边找人家做好的镜像)
3、制作启动盘,先把U盘格式化称Mac OS 日志格式,然后在终端里边执行命令:
sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/U盘名称 --applicationpath /Applications/Install\ macOS\ High\ Sierra.app --nointeraction
U盘是什么名字,就把上边的“U盘名称”替换掉,名字可以任意起; USB 2.0 的U盘用了半个小时左右,耐心等待。
4、在硬盘上制作EFI分区,然后把Clover 引导放进去,我用的版本是4222 , 显卡想要驱动,里边比较关键额是要放入:Lilu.kext、NvidiaGraphicsFixup.kext、NVWebDriverLibValFix.kext 这三个文件,分享包里已经包含
然后是最难也是最讲运气的配置-- Config.plist ,我安装成功的几个要点:
一是修改了SMBIOS配置,用的是 iMac14,2 机型,序列号是:Mac-27ADBB7B4CEE8E61;
二是安装驱动前,CsrActiveConfig 要改为0x00,也就是关闭SIP,Clover 开机引导时,按空格键也可以勾选SIP关闭选项;
三是安装显卡驱动前,nvda_drv=0 ,装完驱动后nvda_drv=1
5、前边步骤做完了,就开始安装10.13.1系统了,选择安装了Clover EFI的硬盘启动,U盘插上可以看见Mac OS High Sierra install 选项,选择安装,过程会重启一次,然后继续选择该项安装,然后过程会持续三十多分钟。( 10.13格盘安装时,第一次选择Mac OS High Sierra install安装重启后,会出现另一个Mac os install 选项,重启后要选择这个选项继续安装的,格式化磁盘安装的小伙子注意一下)
6、安装显卡驱动,从刚才安装好的磁盘启动,(启动前按空格检查一下,SIP关闭要勾上,nvda_drv=1不能勾),启动后用NVIDIA 官方驱动管理工具进行安装,管理工具可以选择在线安装,也可以把驱动包下载下来安装,我是选择下载的。
7、安装完重启,勾选 nvda_drv=1 看运气吧,运气好跑完log后是启动页面,不好跑完log后直接无信号黑屏.
Nvidia Graphic Card Injection 英伟达显卡驱动第1部分:地址位置
1。启动您的系统与GraphicsEnabler=Yes
2。下载名为ioreg的应用在这里
2。打开名为ioreg:
4。找到你的Nvidia图形卡的地址位置:
5.记录设备名称及地址:
注意在这个例子中,设备是PCI1
第二步, 要有 DSDT Edit
1.打开你的DSDT位于你的Extra的文件夹在启动驱动器根目录:
2.找到你的硬件位置
3.检查设备的代码:
4.在最后的中间开始添加代码
下载编辑工具 Text Document here
6. 复制下面的代码 粘贴进去
Device (GFX0) /** for Nvidia Fermi Graphics Cards **/
{
Name (_ADR, Zero)
Name (_SUN, One)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x1E)
{
“AAPL,slot-name”,
“PCI x16″,
“@0,compatible”,
Buffer (0x0B)
{
“NVDA,NVMac”
},
“@0,connector-type”,
Buffer (0×04)
{
0×00, 0×08, 0×00, 0×00
},
“@0,device_type”,
Buffer (0×08)
{
“display”
},
“@0,name”,
Buffer (0x0F)
{
“NVDA,Display-A”
},
“@1,compatible”,
Buffer (0x0B)
{
“NVDA,NVMac”
},
“@1,connector-type”,
Buffer (0×04)
{
0×00, 0×08, 0×00, 0×00
},
“@1,device_type”,
Buffer (0×08)
{
“display”
},
“@1,name”,
Buffer (0x0F)
{
“NVDA,Display-B”
},
“NVCAP”,
Buffer (0×18)
{
/* 0000 */ 0×04, 0×00, 0×00, 0×00, 0×00, 0×00, 0×03, 0×00,
/* 0008 */ 0x0C, 0×00, 0×00, 0×00, 0×00, 0×00, 0×00, 0x0A,
/* 0010 */ 0×00, 0×00, 0×00, 0×00
},
“VRAM,totalsize”,
Buffer (0×04)
{
0×00, 0×00, 0×00, 0xc0
},
“device_type”,
Buffer (0x0C)
{
“NVDA,Parent”
},
“model”,
Buffer (0×10)
{
“GeForce GTX 580″
},
“rom-revision”,
Buffer (0x1D)
{
“nVidia GTX 580 OpenGL Engine”
},
“hda-gfx”,
Buffer (0x0A)
{
“onboard-1″
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}
Device (HDAU)
{
Name (_ADR, One)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0×02)
{
“hda-gfx”,
Buffer (0x0A)
{
“onboard-1″
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}
复制代码
7. 添加继续 修复看下是不是有错误。注意 里面的显卡参数是可以修改的 根据自己的硬件修改 继续看下
第三步就是修复错误
找到下面的代码
“VRAM,totalsize”,
Buffer (0×04)
{
0×00, 0×00, 0×00, 0xc0
},
复制代码
这个代码意思就是显卡 显存 大小修改 512M 256M 1G 2G等等
怎么修改 我们给大家列出来
0xc0=3072=3GB
0×80=2048=2GB
0×60=1536=1.5GB
0×40=1024=1GB
0×20=512=0.5GB
只需修改最后 一个数值就可以了 比如 你的显卡是1G 的
就应该是下面的代码,明白了吧 。
“VRAM,totalsize”,
Buffer (0×04)
{
0×00, 0×00, 0×00, 0x40
},
复制代码
8.找到显卡Model 这个就是显卡型号 修改的
“model”,
Buffer (0×10)
{
“GeForce GTX 580″
},
复制代码
注意在这了修改显卡型号 要注意,在这里我们都是十六进制的 比如“GeForce GTX 580”这几个数值里 总共有15个位置,一定要把空格算上,我们要把这个位置数值+1,比如这里的“GeForce GTX 580”也就是15+1=16 ,这里16的十六位进制 就是10,不会的可以百度查询 16的十六进制就知道了
大家可能知道了这里的10 对应的就是 Buffer(0×10),这个数值。对应正确即可。
9.继续看下面 找到下面的DSDT
“rom-revision”,
Buffer (0x1D)
{
“nVidia GTX 580 OpenGL Engine”
},
复制代码
这里是修改显卡ROM修正,修改方法 跟上面对应 是一样的 数值对应即可。
最后就是编辑下编译DSDT
基本原理
在电脑开机时(对应_INI method)和睡眠唤醒时(对应_WAK method)调用关闭Nvidia独显的Method。
这个网站http://hybrid-graphics-linux.tuxfamily.org/index.php?title=ACPI_calls总结了关闭Nvidia显卡的常见methods,还列举了一些机型的具体情况,大家可以去看看,弄清楚自己电脑关闭显卡的method究竟是哪个,然后结合这个帖子来修改DSDT.
正如上面那个网站所示,关闭Nvidia独显一般有两种方法:一、使用 _DSM + _PS3;二、直接用_OFF(或者DOFF,SGOF等等,有些机型是不同的);
虽然上面那个网站一般都是直接调用OFF()函数来关闭独显的,但个人觉得如果有_DSM和_PS3的话,先使用方法一比较好,因为方法二可能会有一些影响,比如CPU变频的问题。(具体请看参考帖子[教程] 解决Optimus 和CPU Turbo 变频冲突)。
具体方法
很多人喜欢把SSDT的显卡部分移到DSDT中然后添加关闭独显的代码,并且开机DropOEMSSDT只用DSDT。但是我个人觉得这样子很麻烦,首先在移动过程中可能会产生错误,而且Drop掉SSDT后,DSDT中的那些External variables,methods就无法access了,因此DSDT中用到这些Objects,Methods的地方就会产生问题。如果Drop SSDT的目的是为了使用clover和变色龙的Generate P-States和C-States的话,clover可以只Drop掉有CPU信息的SSDT,变色龙可以把除有CPU信息的其他SSDT放在Extra目录下再DropSSDT,所以我认为完全没有必要花时间来移动显卡部分或者其他东西。如果DSDT和SSDT要相互调用对方的函数,那就在definition block那里加上External就好了。(如果新人看不懂这一段就跳过吧)说了那么多废话,终于开始了。
注意,在修改DSDT和SSDT之前,可以用这个帖子介绍的方法先生成dsl文件,可以减少错误,还有其他错误自己爬帖解决。不过如果你某个DSDT或SSDT有错误不能解决但你不需要再把它编译成AML文件的话,可以不用管它。
方法一:搜索函数
首先在DSDT和SSDT中搜索找到要用的函数_WAK,_INI,_PS3,_DSM。_WAK一般只有一个。_INI可能有很多个,最好用\_SB.PCI0下或\_SB.PCI0.PEG0.PEGP的。_PS3只有一个,如果没有的话看方法二。_DSM会有很多个,一定要用\_SB.PCI0.PEG0.PEGP下的,如果\_SB.PCI0.PEG0.PEGP下没有,搜索看看Device(GFX0)下有没有,如果都没有就看方法二.(注意,以下步骤是默认你DSDT的相关methods为一般情况,若有不同需根据你自己的DSDT做相应更改)
方法一:在_WAK之前新建一个Method PINI()
Method (PINI, 0, NotSerialized)
{
\_SB.PCI0.PEG0.PEGP._DSM (Buffer (0x10)
{
/* 0000 */ 0xF8, 0xD8, 0x86, 0xA4, 0xDA, 0x0B, 0x1B, 0x47,
/* 0008 */ 0xA7, 0x2B, 0x60, 0x42, 0xA6, 0xB5, 0xBE, 0xE0
}, 0x0100, 0x1A, Buffer (0x04)
{
0x01, 0x00, 0x00, 0x03
})
\_SB.PCI0.PEG0.PEGP._PS3 ()
}
方法一:在_WAK和适当的_INI中调用PINI()
_WAK和_INI可能不在同一个DSDT或SSDT中,没有关系
Method (_WAK, 1, Serialized)
{
PINI ()
......
}
[。。。省略。。。]
Method (_INI, 0, NotSerialized)
{
PINI ()
.......
}
方法一:编译错误
如果有类似以下的错误
Error Object does not exist (PINI)
在DefinitionBlock(在DSDT和SSDT的最上面)加上以下代码
External(PINI, MethodObj)
方法一:错误修正示范:
DefinitionBlock ("acpi_dsdt.aml", "DSDT", 1, "LENOVO", "CB-01 ", 0x00000001)
{
External (_SB_.PCI0.PAUD.PUAM, MethodObj) // Warning: Unresolved Method, guessing 0 arguments (may be incorrect, see warning above)
External (_SB_.PCI0.XHC_.DUAM, MethodObj) // Warning: Unresolved Method, guessing 0 arguments (may be incorrect, see warning above)
External (_SB_.TPM_.PTS_, MethodObj) // Warning: Unresolved Method, guessing 1 arguments (may be incorrect, see warning above)
External (_PR_.CFGD, FieldUnitObj)
External (_PR_.CPU0._PPC, IntObj)
External (_PR_.CPU0._PSS, PkgObj)
External (PINI, MethodObj)
如果错误提示Object does not exist (\_SB.PCI0.PEG0.PEGP._PS3)
在DefinitionBlock加上
External(_SB_.PCI0.PEG0.PEGP._PS3, MethodObj)
如果错误提示Object does not exist (\_SB.PCI0.PEG0.PEGP._DSM)
在DefinitionBlock加上
External(_SB_.PCI0.PEG0.PEGP._DSM, MethodObj)
方法一:保存编译
没有错误了,编译,save AML,把修改了的DSDT.aml, SSDT.aml和其他所以没有修改的SSDT*.aml放在Extra目录(变色龙),或patched文件夹(Clover),这样的话要DropSSDT。开机,幸运的话,Nvidia显卡应该被屏蔽了。
方法二:没有_PS3函数
如果没有_PS3函数,或者使用上面的方法没效果,那就试试这个方法吧。
在_WAK和适当的_INI里面加入\_SB.PCI0.PEG0.PEGP._OFF()
Method (_WAK, 1, Serialized)
{
\_SB.PCI0.PEG0.PEGP._OFF()
......
}
[。。。省略。。。]
Method (_INI, 0, NotSerialized)
{
\_SB.PCI0.PEG0.PEGP._OFF()
.......
}
方法二:编译错误
如果编译时有错误,像方法一的4中那样解决错误即可。
方法二:编译保存
没有错误了,编译,save AML,把修改了的DSDT.aml, SSDT.aml和其他所以没有修改的SSDT*.aml放在Extra目录(变色龙),或patched文件夹(Clover),这样的话要DropSSDT。开机,幸运的话,Nvidia显卡应该被屏蔽了。
查看是否生效
如何查看是否成功屏蔽Nvidia独显:打开“系统信息”→“图形卡/显示器”,若只有Intel显卡的信息就证明屏蔽成功。若成功了就支持一下吧!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)