u8 checksum; /* To make sum of entire table == 0 */ char oem_id[ACPI_OEM_ID_SIZE]; /* ASCII OEM identification */
char oem_table_id[ACPI_OEM_TABLE_ID_SIZE]; /* ASCII OEM table identification */
u32 oem_revision; /* OEM revision number */
char asl_compiler_id[ACPI_NAME_SIZE]; /* ASCII ASL compiler vendor ID */ u32 asl_compiler_revision; /* ASL compiler version */ };
3, (RSDT/XSDT之外的) ACPI描述表数组的第一个:FADT
这个数组的第一个元素由XSDT中的table_offset_entry[0]指定位置。
被指向的第一个表通常是FADT(Fixed ACPI Description Table),它的几个主要作用:
1) 保存着FACS和DSDT表的地址(64位也是)
2) 包含一些entries,每个entry有固定的length,描述一个硬件的ACPI feature(我的理解就是,
硬件对ACPI的支持程度)
Linux下FADT的定义见struct acpi_table_fadt结构。
4. DSDT表(Differentiated System Description Table)
由FADT中的字段指向,见上一条笔记。
//Thanks for wheelz!
DSDT表包含一个Definition Block,叫作'Differentiated Definition Block for the DSDT',它包含了
实现与配置信息(implementation and configuration information)。 OSPM用这些信息来实现:电源管理,
热量管理,以及(在ACPI硬件寄存器所描述的信息之外的)即插即用。
//FIXME: 奇怪的是,Linux没有提供一个struct acpi_table_dsdt 结构的定义,只提供了一个` acpi_system_read_dsdt()函数。
//FIXED: 注意,这个acpi_system_read_dsdt()函数不是内核用来load DSDT表的,而 是为了让用户程序(例如cp)通过/proc/acpi/dsdt来读取DSDT表的(in AML format),以便给内核开发者诊断 问题。
很多platform vendor提供的BIOS,特别是笔记本上,其DSDT表往往有BUG,导致Linux的电源管理出现问题。
Linux内核提供了CONFIG_ACPI_CUSTOM_DSDT和CONFIG_ACPI_CUSTOM_DSDT_FILE配置选项,允许用户自己提供
DSDT文件,替代BIOS中有BUG的那个。
这个用户自己提供的DSDT文件,其实就是一个AML语言描述的数据块。 可以用pmtools中的acpidump和
acpixtract程序把ACPI的表从BIOS中提取出来,再用iasl工具(Intel ACPICA中的ASL编译器、
AML反汇编器)
反汇编它,修正BUG,然后编译。
这个原理,参考Linux内核的acpi_os_table_override()函数。
5. SSDT表
它是DSDT表的扩展。如果有这个表,RSDT/XSDT中就有指向它的指针。 SSDT表可能有不止一个。 Definition Blocks, 都是定义在DSDT或者SSDT(s)表里的。其它的表没有 定义块。
6, FACS表(Firmware ACPI Control Structure)
跟DSDT表一样,FACS表也由FADT表中的字段指向。见笔记<3>。
7, CPU的Idle States (C-states)
从C0到C
n越大,CPU越省电,但从它转到C0的所需时间也越长。
Linux下,可以通过kernel parameter: processor.max_cstate来改变
8, CPU的Performance States (P-States), CPU频率管理
从P0到P
注意,只有C-State处于C0状态时,这些P-States才是有意义的。 如果CPU处于C
频率没有任何意义。
9, CPU的Throttling States (T-States)
Throttling是个什么意思呢?--CPU每秒多少个时钟周期s,我们称之为Cycles Per Seconds (CPS)。可以让
CPU在一个CPS中有一定比例的空闲时间。
T-States从T0到T
除了T0外的T-States,和“7, CPU的Performance States (P-States), CPU频率管理”不同,后者只是\让每
秒的周期数少一些\; 它也和CPU的空闲状态(例如C1状态)不同,后者是CPU在1秒钟里所有的周期都是空闲的。
Throttling不会降低电压,它只是让每秒钟都有几个时钟周期是空闲的。--注意,给定一个工作量, Throttling会导致CPU需要更长的时间来完成它,从而耗费更多的电。(电压不变,时间加长,自然耗电变多)
10. CPU的\
in ACPI there are 6 power state:
S0, S1, S2, S3, S4, and S5.
S0 : The Running state.
S1 : the suspend state. in this state, the CPU will suspend activity but remains its contexts.
S2 & S3 : sleep states. in these states,memory contexts are held but CPU contexts are lost.
the difference between S2 and S3 are in CPU re-initialization done by firmware and device reinitialization.
S4 : a sleep state in which contexts are saved to disk. the context will be restored