ARTS Tips:黑苹果继续补课

2,572 阅读4分钟

前几篇请参考

最近涉及到黑苹果的事情比较多,顺便就一起补课,解决一下基础内容。

什么是ACPI?

ACPI 是 Hewlett-Packard, Intel, Microsoft, Phoenix 和 Toshiba 共同制定的一个开放的行业规范。是 The Advanced Configuration and Power Interface 的缩写,也就是“电源管理模式和配置管理的接口规范”。从名字可以看出主要是“电源管理”和“配置管理”。是 BIOS 的一个高级功能模块。

它帮助操作系统合理控制和分配计算机硬件设备的电量,有了ACPI,操作系统可以根据设备实际情况,根据需要把不同的硬件设备关闭。如Win7或者Win8系统,系统睡眠时,系统把当前信息储存在内存中,只保留内存等几个关键部件硬件的通电,使计算机处在高度节电状态。当然这只是它功能中的很少一部分。

它主要涵盖的功能包括:

  • System power management(系统电源管理)
  • Device power management(设备电源管理)
  • Processor power management(处理器电源管理)
  • Device and processor performance management(设备及处理器性能管理)
  • Configuration / Plug and Play(配置/即插即用)
  • System Events(系统事件)
  • Battery management(电池管理)
  • Thermal management(温度管理)
  • Embedded Controller(嵌入式控制器)
  • SMBus Controller(SMBus控制器)

在计算机应用平台,ACPI 越来越重要。ACPI由很多表组成,包括:RSDP,SDTH,RSDT,FADT,FACS,DSDT,SSDT,MADT,SBST,XSDT,ECDT,SLIT,SRAT。其中DSDT就是它的一个重要的描述表。

什么是DSDT和SSDT?

DSDT 是 The Differentiated System Description Table 的简写。字面上就可以知道它是一个描述系统不同信息的表。它包含了所有除基本系统以外所有不同设备的信息,也就是每台计算机设备的基本系统是相同的,而不相同的设备用 DSDT 来描述。DSDT 表代码为 ACPI Machine Language (AML)。

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

Mac OS X不完整支持ACPI规范,仅支持它的子集DSDT。

ACPI SSDT 是 Secondary System Descriptor Table 的缩写,它也是ACPI的描述表,包含了额外的AML信息,可以用来和硬件交互。用来定义的语言也是AML代码,和DSDT一样,通常SSDT是DSDT的补充。

什么是重命名ACPI对象(Renaming ACPI objects)?

因为OS X 可以依赖于mac使用的特定的ACPI对象名称,一个常见的补丁是在原始ACPI集合中重命名一个对象。例如,大多数PC笔记本电脑使用GFX0来表示集成的 Intel GPU 对象(Intel HD Graphics)。在OS X中,除非该设备被命名为IGPU,否则不会启用英特尔图形的电源管理。使用静态补丁,我们应用“Rename IGPU to GFX0”来重命名这个对象,补丁必须应用到DSDT和所有引用它的SSDTs。

上次我们修改的就是通过这个方法解决7m核显的问题,重新命名的补丁将是

Comment: Rename GFX0 to IGPU
Find: <4746 5830>
Replace: <4947 5055>

查找和替换的十六进制值分别是 GFX0 和 IGPU 的 ASCII码,其实可以用下面的代码解释一下:

u430:~ RehabMan$ echo -n GFX0|xxd
0000000: 4746 5830                                GFX0
u430:~ RehabMan$ echo -n IGPU|xxd
0000000: 4947 5055                                IGPU

参考资料