背景
在分析Linux內核驅動的時候,有時候會看到一些acpi字樣的接口。
之前一直沒搞明白ACPI是什么,現在知道了。
Reference :
https://www.cnblogs.com/junzhkevin/archive/2013/02/25/2932801.html
http://bbs3.driverdevelop.com/read.php?tid=99720
ACPI
Advanced Configuration and Power Management Interface
: 用於配置與電源管理的接口,是讓OS使用的。用在x86架構上Windows系統多一點。
- 不同的表,有不同的用途,像IO APIC中斷配置表 專門負責 中斷(可以用WinDbg等工具自己去看代碼)。
簡單地理解,ACPI Table 與 Windows 的關系, 猶如 Device Tree 與 embedded-Linux 的關系。
介紹
ACPI SPEC定義了ACPI-compatible OS與BIOS之間的接口,ACPI Tables就是BIOS提供給OS的硬件配置數據,包括系統硬件的電源管理和配置管理。
BIOS在POST過程中,將RSDP存在0xE0000--0xFFFFF的內存空間中,然后Move RSDT/XSDT, FADT, DSDT到ACPI Recleam Area, Move FACS到ACPI NVS Area,最后填好表的Entry鏈接和Checksum。
控制權交給OS之后,由OS來開啟ACPI Mode,首先在內存中搜尋ACPI Table,然后寫ACPI_Enable到SMI_CMD,SCI_EN也會被HW置起來。
ACPI Tables根據存儲的位置,可以分為:
1). RSDP位於F段,用於OSPM搜索ACPI Table,RSDP可以定位其他所有ACPI Table
2). FACS位於ACPI NVS內存,用於系統進行S3保存的恢復指針,內存為NV Store
3). 剩下所有ACPI Table都位於ACPI Reclaim內存,進入OS后,內存可以釋放
ACPI Table根據版本又分為1.0B,2.0,3.0,4.0。
2.0以后,支持了64-bit的地址空間,因此幾個重要的Table會不大一樣,比如:RSDP,RSDT,FADT,FACS。