DSDT编译错误修改方法【从零开始轻松使用上DSDT】

OS X Mountain Lion 13/12/6 15.5k 0

很多人都知道使用DSDT补丁可以开双核,但DSDT的功能不仅仅如此,除了开双核,还可以可以修复ACPI缺陷(不需要Disabler.kext,原版cpupowermanagement正常使用),RTC,HPET缺陷(原版kext正常工作),显卡(代替efistring),声卡(只是代替了HDAEnabler.kext),网卡(包括TimeMachine问题),此外还可以解决其他很多奇奇怪怪的问题,因此建议尽可能使用DSDT补丁。

      但是DSDT到底是什么东西,怎么这么神奇呢?这个要从ACPI说起了,ACPI是Intel(i386,x86_64,IA64)平台的标准固件规范,绝大部分OS需要从BIOS得到的信息都可以从ACPI得到,并且现在的趋势是未来的任何新的特性相关的信息都只能从ACPI得到。

      ACPI的信息包括:
      配置信息,这些信息从legacyPNP设备的配置,到多处理器,到NUMA,比如现在的MultipleCore的信息就只能从ACPI得到。Linux启动很多代码就是处理这些配置信息,比如APIC,IOAPIC设置等。
      ACPI相关设备,主要是笔记本电脑相关的设备,包括电源按钮,电池,外接电源,风扇,热键等。
      底层硬件,比如PCI中断路由,chipset(主要是南桥PCI-to-LPCbridge)操作等。
      电源管理,ACPI定义的电源管理包括CPU的电源管理(调频率P-state,idleC-state,throtting T-state),设备电源管理(D-state),系统电源管理(Suspend-to-Ram,Suspend-to-Disk, power off)等。
      设备热插拔,ACPI用一种统一的方式来描述设备的热插拔,这样的设备从单一的PCI设备,到笔记本电脑的DockingStation,到整个PCI hierarchy,CPU,Memory,甚至整个NUMA节点。

      可以说要理解现代PC平台必须了解ACPI。ACPI主要是由很多表(Table)组成,而DSDT(Differentiated System Description Table)是其中一个最主要的ACPI表之一,它的定义如下

      DSDT is an acronym for DifferentiatedSystem Description Table. Thistable contains the Differentiated Definition Block, which supplies theinformation and configuration information about the base system.

      简单说就是包含了所有和基本系统(basesystem)不同的设备的信息,basesystem每台机器都是一样的,这个是在acpispec里指定的,但是每台机器都是不相同的,所以不相同的设备大都是由DSDT表来描述。它包含了很多AML代码。大多数BIOS是针对windows开发的,而windows自己也不完全遵循acpi规范,所以因为BIOS的bug,这些代码本身可能有错,导致其他的系统,如linux,mac os出错。

      我们可以手动修复这些bug使之兼容MAC系统。DSDT在bios里是以编译后的aml文件存在,需要把它解出来,反编译成aml代码形式(dsl文件,文本文件),代码修改完毕再重新编译,替换掉bios里原来的dsdt表。不过PC-EFI,Chameleon的出现,使得我们不再需要冒险刷bios,只要把制作好的DSDT.aml文件放在根目录或者/Extra文件夹里,启动的时候就会自动使用这个DSDT.aml,从而达到修复ACPI系统bug的作用。






接下来讲一些DSDT能修复哪些不兼容问题和DSDT一些基本知识。


我们最终使用的DSDT文件是dsdt.aml【名称不区分大小写,但千万不可使用不同主板的DSDT】,如果你使用变色龙【推荐】引导,放在mac分区的Extra文件夹
完整路径: /Extra/dsdt.aml
如果你使用Boot Think引导,放在C盘的Darwin文件夹
完整路径:C:\Darwin\dsdt.aml
跟DSDT很像的SSDT【非必要文件。SSDT用于控制自动降频,提升性能、解决CPU温度过高问题,视频教程中有演示】文件也是放在Extra文件夹,提取的文件依次命名为SSDT.aml、SSDT-1.aml 。。。编译通过的话在org.chameleon.Boot.plist添加
  1.         <key>DropSSDT</key>
  2.          <string>Yes</string>
复制代码
接下来说DSDT的作用


  • 一,修复BIOS重置问题【RTC】

不用DSDT的话一般通过ElliottForceLegacyRTC.kext或LegacyAppleRTC.kext(2选1,不可共用)来修复该问题,用DSDT修复该问题后记得要把这两个kext删除。


  • 二,LPC 原生电源管理、睡眠
  • 有些主板原生支持电源管理,则无需在DSDT添加相关代码【我的HM55可以】。如果需要使用NullCPUPowerManagement.kext或者删除AppleIntelCPUPowerManagement.kext【不推荐】才能进系统,那你就要在DSDT添加电源管理代码。还有三个情况要说明一下:1,如果添加代码后还不支持电源管理,貌似要对kext打补丁;2,很多华硕主板无法在DSDT找到相关字段添加代码,不知道华硕不支持电源管理还是怎样?我没接触过华硕主板,遇到这些问题自行搜索;3,现在论坛里有Speedstep补丁,貌似也可以通过那个补丁加载电源管理。总之,先判断主板是否原生支持电源管理,如果不行再住DSDT代码里添加代码,如果还不行,再使用补丁。【添加电源管理后也要把NullCPUPowerManagement.kext删除(否则还是无法加载电源管理),有删除AppleIntel。。的话,重新安装回去】
    • 三,内建网卡
    如果没有内建网卡,无法登陆App Store、FaceTime等


    可通过在org.chameleon.Boot.plist添加
    1. <key>EthernetBuiltIn</key>
    2.         <string>Yes</string>
    复制代码
    解决该问题。如果使用DSDT内建网卡后,也要记得把該行代码删除。
    但并不是所有主板都要手动添加内建网卡代码,我的原始DSDT已经有内建代码信息,不过内建名称不是GIGE,而是
    1. Device (PXSX)
    2.                 {
    3.                     Name (_ADR, Zero)
    4.                     Name (_PRW, Package (0x02)
    5.                     {
    6.                         0x09,
    7.                         0x04
    8.                     })
    9.                 }
    复制代码
    上面这段代码只是拿出来看一下!!!不是规范的内建代码,规范的内建代码请看附件里的word文档。内建网卡后


    1. 删除/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist(显示隐藏文件,或者用前往方式)
    2. 在系统设置偏好里/网络 里删除所有网络连接
    3. 重新启动
    4. 重新在系统设置偏好里/网络 里加所有网络连接

    PS:USB网卡不能内建,如果不能驱动本地网卡(包括笔记本和台式机PCI无线网卡)并内建,意味着你永远无法登陆appstore。笔记本的话可以考虑换无线网卡,台式机考虑上一个PCI以太网卡或者无线网卡。只有这样才能解决appstore不能登陆的问题。



    • 四,加载仿冒声卡驱动

    这个跟仿冒声卡有关,请自行查看集合帖有关仿冒声卡的帖子。如果你没使用仿冒声卡,无需在DSDT添加仿冒声卡代码。贴一个通用简洁的仿冒声卡代码【需稍作修改,该代码附件里也有】,切记添加该段代码不可与万能声卡共用!!否则会五国。
    1. Method (_DSM, 4, NotSerialized)
    2. {
    3. Store (Package (0x06)
    4. {
    5. "layout-id",
    6. Buffer (0x04)
    7. {
    8. 0x0D, 0x01, 0x00, 0x00 //此处值看附件具体介绍
    9. },
    10. "device-name",
    11. Buffer (0x0F)
    12. {
    13. "Realtek ALC269"//此处名称自定义
    14. },
    15. "PinConfigurations",
    16. Buffer (Zero) {}
    17. }, Local0)
    18. DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
    19. Return (Local0)
    20. }
    复制代码
    • 五,添加显卡信息,辅助驱动显卡

    显卡信息代码不通用,这边不作具体介绍【很复杂,分A卡、N卡,就算同一个牌子的卡也有很多种代码】。不过希望各位推荐几篇通过DSDT来完美显卡的帖子【特别是N卡】,给新手来个传送门。

    我先推荐我自己的一篇救助帖【只适于假免驱的A卡】


    • 六,USB内建、解决硬盘橙色、关机断电等问题

    因为USB内建、关机断电代码不通用,不一定能解决问题,这边也不作具体介绍,要解决这些问题到集合帖看相关帖子或者搜索,【本文只提通用的DSDT代码】关于解决硬件橙色问题,也自行搜索代码。


    看完这些你就可以开始动手提取DSDT、修改DSDT了。不过在修改DSDT之前
    建议先到http://www.tonymacx86.com/11-dsdt-database.html看是否有你主板的DSDT【一定要对应你的主板型号和BIOS版本,技嘉主板几乎都有】,如果有直接下载该DSDT来稍作修改。


    虽说是视频教程,但也写了这么多文字。。。
    关于视频,打算多演示几个修复DSDT错误,但一不小心录长了。另外个人能力有限,视频演示之内容可能有错,还请高手指出,如果视频和本帖内容有矛盾地方,以此贴内容为准。


    推荐使用aida64extreme提取原始DSDT文件

    aida64extreme、Java for Mac、DSDT工具【已经包含DSDT基本修改文档下载地址: 百度网盘
    MultiBeast 下载:传送门


    请使用本帖0.7版本的dsdt editor,在0.7编译没错的dsdt在0.8编译可能有错。还有,DSDT文件所在路径不能有中文】




    更新DSDT常见错误、警告及修复方法。
    更新方法:如果谁提取原始DSDT文件后按照视频或帖子里的方法无法修复错误,可直接上传原始DSDT文件【acpi_dsdt.bin】,我会尽我最大努力修复错误。

    但是给你们伸手的机会也要有前提:在此帖中本人只作原始DSDT文件修改,如果谁添加什么代码出错后再上传,我不会修改,因为我能力有限。还有,如果你真的要伸手,请确定你按照视频操作并且此贴也还没更新该错误的修改方法,你才可以上传附件让我帮你修改,如果视频中有提到或者此贴已经更新该错误,一率不理这些伸手党。给你们伸手的机会是为了让后面的人不用去伸手。
    最后还要说明的是:因个人能力、时间有限,肯定不能帮每个人修改DSDT。

    今天写帖有点累了,后面慢慢更新一些DSDT常见错误修改方法。

    ---------------------------------------------------------------------------------------分隔符--------------



    关于修复


  • 关于修复

    19
    Error
    Name already exists in scope (\TNOT)

    搜索关键字TNOT,把相关字段删除即可修复错误【如果删除不干净,会自动添加回去
      1. If (CondRefOf (\TNOT))
      2.             {
      3.                 TNOT ()
      4.             }
      复制代码
    复制代码
      1. External (TNOT, MethodObj)    // 0 Arguments
      复制代码
    复制代码
    1. External (\TNOT)
    复制代码
    • 关于修复
    3392
    Warning
    Called method may not always return a value
    3500
    Warning
    Not all control paths return a value (XXX)
    如果遇到此类警告,先给XXX函数返回一个,第一个警告也会消除
    1. Return (Zero)
    复制代码
    • 关于修复
    3237
    Warning
    Possible operator timeout is ignored
    1. Acquire (MUT0, 0x0FFF)   或者    Acquire (MUTE, 0x03E8)
    复制代码
    修改为
    Acquire (****, 0xFFFF)


    • 关于修复
    8542
    Warning
    Reserved method must return a value (Buffer required for _CRS)


    我想了一个更好的办法
    Device (^^MEM2)
                    {
                        Name (_HID, EisaId ("PNP0C01"))
                        Name (_UID, 0x02)
                        Name (CRS, ResourceTemplate ()
                        {
                            Memory32Fixed (ReadWrite,
                                0x20000000,         // Address Base
                                0x00200000,         // Address Length
                                )
                            Memory32Fixed (ReadWrite,
                                0x40000000,         // Address Base
                                0x00200000,         // Address Length
                                )
                        })
                       Method (_CRS, 0, NotSerialized)
                        {
                            If (IGDS)
                            {
                                Return (CRS)
                            }
                        }
                    }

    错误提示Method (_CRS, 0, NotSerialized)必须要返回一个函数,视频中的方法是删除判断直接让Method (_CRS, 0, NotSerialized)返回CRS,但想来想去这很不规范,于是想出了下面这个办法。主要还是return (zero),在Method (_CRS, 0, NotSerialized)前面随便添加一个函数,让该函数返回zero。修改之后
    Device (^^MEM2)
                    {
                        Name (_HID, EisaId ("PNP0C01"))
                        Name (_UID, 0x02)
                        Name (CRS, ResourceTemplate ()
                        {
                            Memory32Fixed (ReadWrite,
                                0x20000000,         // Address Base
                                0x00200000,         // Address Length
                                )
                            Memory32Fixed (ReadWrite,
                                0x40000000,         // Address Base
                                0x00200000,         // Address Length
                                )
                        })
                        Method (RES, 0, NotSerialized)
                        {
                           Return (Zero)
                         }


                        Method (_CRS, 0, NotSerialized)
                        {
                            If (IGDS)
                            {
                                Return (CRS)
                            }
                            else
                            {
                                Return (RES)
                            }

                        }
                    }

    • ------------
      DTGP函数

      4254
      Error
      Object does not exist (DTGP)
    • 苹果必要函数,在dsdt头部添加以下函数【本文通过dsdt fixer添加】
      1. Method (DTGP, 5, NotSerialized)
      2.     {
      3.         If (LEqual (Arg0, Buffer (0x10)
      4.                 {
      5.                     /* 0000 */    0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
      6.                     /* 0008 */    0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B
      7.                 }))
      8.         {
      9.             If (LEqual (Arg1, One))
      10.             {
      11.                 If (LEqual (Arg2, Zero))
      12.                 {
      13.                     Store (Buffer (One)
      14.                         {
      15.                             0x03
      16.                         }, Arg4)
      17.                     Return (One)
      18.                 }
      19.                 If (LEqual (Arg2, One))
      20.                 {
      21.                     Return (One)
      22.                 }
      23.             }
      24.         }
      25.         Store (Buffer (One)
      26.             {
      27.                 0x00
      28.             }, Arg4)
      29.         Return (Zero)
      30.     }
      复制代码
      ------------
      关于修复SSDT的
      144
      Error
      parse error
      删除下面的代码【共两处】
      1. Package (0x06)
      2.         {
      3.             0x80000000,
      4.             0x80000000,
      5.             0x80000000,
      6.             0x80000000,
      7.             0x80000000,
      8.             0x80000000
      9.         }
      10.         Package (0x06)
      11.         {
      12.             0x80000000,
      13.             0x80000000,
      14.             0x80000000,
      15.             0x80000000,
      16.             0x80000000,
      17.             0x80000000
      18.         }
      19.         Package (0x06)
      20.         {
      21.             0x80000000,
      22.             0x80000000,
      23.             0x80000000,
      24.             0x80000000,
      25.             0x80000000,
      26.             0x80000000
      27.         }
      28.         Package (0x06)
      29.         {
      30.             0x80000000,
      31.             0x80000000,
      32.             0x80000000,
      33.             0x80000000,
      34.             0x80000000,
      35.             0x80000000
      36.         }
      37.         Package (0x06)
      38.         {
      39.             0x80000000,
      40.             0x80000000,
      41.             0x80000000,
      42.             0x80000000,
      43.             0x80000000,
      44.             0x80000000
      45.         }
      46.         Package (0x06)
      47.         {
      48.             0x80000000,
      49.             0x80000000,
      50.             0x80000000,
      51.             0x80000000,
      52.             0x80000000,
      53.             0x80000000
      54.         }
      55.         Package (0x06)
      56.         {
      57.             0x80000000,
      58.             0x80000000,
      59.             0x80000000,
      60.             0x80000000,
      61.             0x80000000,
      62.             0x80000000
      63.         }
      64.         Package (0x06)
      65.         {
      66.             0x80000000,
      67.             0x80000000,
      68.             0x80000000,
      69.             0x80000000,
      70.             0x80000000,
      71.             0x80000000
      72.         }
      73.         Package (0x06)
      74.         {
      75.             0x80000000,
      76.             0x80000000,
      77.             0x80000000,
      78.             0x80000000,
      79.             0x80000000,
      80.             0x80000000
      81.         }
      82.         Package (0x06)
      83.         {
      84.             0x80000000,
      85.             0x80000000,
      86.             0x80000000,
      87.             0x80000000,
      88.             0x80000000,
      89.             0x80000000
      90.         }
      91.         Package (0x06)
      92.         {
      93.             0x80000000,
      94.             0x80000000,
      95.             0x80000000,
      96.             0x80000000,
      97.             0x80000000,
      98.             0x80000000
      99.         }
      100.         Package (0x06)
      101.         {
      102.             0x80000000,
      103.             0x80000000,
      104.             0x80000000,
      105.             0x80000000,
      106.             0x80000000,
      107.             0x80000000
      108.         }
      109.         Package (0x06)
      110.         {
      111.             0x80000000,
      112.             0x80000000,
      113.             0x80000000,
      114.             0x80000000,
      115.             0x80000000,
      116.             0x80000000
      117.         }
      118.         Package (0x06)
      119.         {
      120.             0x80000000,
      121.             0x80000000,
      122.             0x80000000,
      123.             0x80000000,
      124.             0x80000000,
      125.             0x80000000
      126.         }
      127.         Package (0x06)
      128.         {
      129.             0x80000000,
      130.             0x80000000,
      131.             0x80000000,
      132.             0x80000000,
      133.             0x80000000,
      134.             0x80000000
      135.         }
      136.         Package (0x06)
      137.         {
      138.             0x80000000,
      139.             0x80000000,
      140.             0x80000000,
      141.             0x80000000,
      142.             0x80000000,
      143.             0x80000000
      复制代码
      ----------------

      修改DSDT让PCI显示具体信息【只起修饰作用
      220510fph1n4mhcuobpu5f.png.thumb.png
      在相应的device下添加【跟添加仿冒声卡一样的】
      1. Method (_DSM, 4, NotSerialized)
      2.                        {
      3.                         Store (Package ()
      4.                             {
      5.                                 "AAPL,slot-name",
      6.                                 Buffer ()
      7.                                 {
      8.                                     "Built in"//自定义,插槽
      9.                                 },
      10.                                 "name",
      11.                                 Buffer ()
      12.                                 {
      13.                                     "Dell Wlan 1397 Half MiniCard"//自定义,名称
      14.                                 },
      15.                                 "device_type",
      16.                                 Buffer ()
      17.                                 {
      18.                                     "Airport"//自定义,类型
      19.                                 },
      20.                                 "model",
      21.                                 Buffer ()
      22.                                 {
      23.                                     "BCM4312 802.11b/g Wireless Adapter"//自定义,卡
      24.                                 },
      25.                                 "built-in",
      26.                                 Buffer (One)
      27.                                 {
      28.                                     0x00
      29.                                 }
      30.                             }, Local0)
      31.                         DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
      32.                         Return (Local0)
      33.                     }
      复制代码

相关帖子
花样年华
苹果系统从零开始--MAC OS X 教程
花样年华最后由roykwok回复于 11/11/21
7 / 6.1k
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
您需要登录后才可以回帖 登录 | 注册
本版积分规则