ACPI table作用:
对Hardware interface ,系统信息,Feature和Method的描述,
OS boot的时候,OSPM find ACPI table and use其中的信息
OSPM:Operation System directed configuration and Power Management 操作系统直接电源管理
RSDP 的根系统说明指针
Windows将使用 EFI 系统表来查找 RSDP,如 ACPI 5.0 规范的第 5.2.2.5.2 节中所述,“在已启用 UEFI 的系统上查找 RSDP”。 平台固件在 RSDP 中填写 RSDT 或 XSDT 的地址。 (如果同时提供这两个表地址,Windows首选 XSDT.)
RSDT (或 XSDT) 包含指向平台上提供的任何其他系统说明表的指针
固定 ACPI 硬件表 (FADT)
多中断控制器表 (MADT)
(可选)核心系统资源表 (CSRT)
调试端口表 2 (DBG2)
固件性能数据表 (FPDT)
(DSDT) 的基本系统说明表
(可选) (SSDT) 的其他系统说明
启动图形资源表 (BGRT)
BIOS通过SystemTable 匹配ACPI 的Guid找到RSDP 表
FACP table
\_SB 所有设备/总线对象都定义在此名字空间下
\_GPE GPE寄存器块中通用事件
\_PR ACPI 1.0处理器名字空间。ACPI 1.0要求所有Processor对象都必须定义在此名字空间下。ACPI 允许将Processor对象定义在\_SB名字空间下。为了兼容于ACPI 1.0操作系统,平台可以包 含\_PR名字空间。ACPI兼容名字空间可以将Processor对象定义在\_SB或\_PR范围内,但不能同 时定义在这两个范围
ACPI 架构
S1 : Stop Grant
S2 : CPU power off, chipset and memory
maintains the entire context
S3 : CPU power off, memory is low powered, PM
register are maintained
S4 : Suspend to Disk
OS : OS must save and restore all the context( memory and CPU, chipset
registers )
BIOS : BIOS must save and restore all the context( memory and CPU,
chipset registers )
All states translation are dominated by OS, instead of BIOS
ASL 语言
ASL(ACPI Source Language):
ASL(ACPI Source Language)编译之后得到AML(ACPI manchine Language),置于ACPI table中,ASL用来定义ACPI objects,包括ACPI control methods等,可以控制hardware,读写register等
Method,类似C语言中的函数,可以被其他Method或者OS调用
ASL是高级语言,由OS Aspm驱动解释执行
简单举列:
声明变量 : Name(Data, 0)
声明函数 : Method (fun1, 0x0)
声明Device: Device(COM3)
描述一段内存:Memory32Fixed(ReadWrite, 0xFED81500, 0x300)
描述一组IO:IO (Decode16, 0x3E8, 0x3E8, 0x01, 0x08)
........
ACPI描述设备的时候需要知道它需求的资源,这个时候就需要使用到Resource Descriptor这样一种结构。
操作符用来创建Resource Descriptor
IRQ Descriptor
DMA Descriptor
Extended Interrupt Descriptor
之前有一个IRQ Descriptor,它只能有15个中断,但是对于多于15个中断的情况,就需要使用到这里的Extended Interrupt Descriptor。
ACPI可以实现的功能
1. 系统电源管理 System Power Management
Global Power State:
G0: Working –S0
G1: Sleeping --S1/S3/S4
G2: Soft off –S5
G3: Mechanical off
2. 设备电源管理 Device Power Management
PCI, PCI Express, CardBus, USB, IEEE 1394
Device Power State:
D0: fully on 设备可以完全回应,正常工作
D1: 不同Device Class有不同规范,一般会节省一些电源
D2: 不同Device Class有不同规范,但并非大多数设备都有支援,比D1更省电,通常会关闭一些设备上的功能来达到省电的目的。
D3hot: 不同Device Class有不同规范,当要转到D0 状态是,OS SW要重新初始化该设备
D3: off 电源完全从设备移除
3. 处理器电源管理 Processor Power Management
在G0状态下,Processor Power State:C0, C1, C2, C3…
4. 设备和处理器性能管理 Device and Processor Performance Management
在C0/D0状态下,Device/Processor Performance State: P0, P1, P2, P3…
5. 配置/即插即用 Configuration/Plug and Play
6. 系统事件 System Events
7. 电池管理 Battery Management
8. 温度管理 Thermal Management
9. 嵌入式控制器 Embedded Controller
10. SMBus控制器 SMBus Controller
高级可编程中断控制器(APIC)
有两种工作模式:
- 8259A 模式: 禁用 LAPIC,APIC 直连 CPU
- 标准模式: 启用 LAPIC,所有的外部中断通过 IOAPIC 接收后转发给对应的 LAPIC
为什么设备中断要经过APIC再与CPU相连,而不直接与CPU相连?原因有二:1)存在大量的外部设备,但CPU的中断引脚等资源是很有限的,满足不了所有的直连需求;2)如果设备中断与CPU直接相连,连接关系随硬件固化,这样在MP系统中,中断负载均衡等需求就无法实现了
Local APIC是一种负责接收/发送中断的芯片,集成在 CPU 内部,
每个 LAPIC 都有自己的一系列寄存器、一个内部时钟(TSC)、一个热传感器、一个本地定时设备(APIC-timer)和 两条 IRQ 线 LINT0 和 LINT1。
i
中断类型
LAPIC 主要处理以下中断:
根据 vector 去 IDT 中索引相应地中断描述符
判断特权级是否发生变化,如果中断发生在用户态需要切换到内核态
若发生特权级变化,需要保存用户态地 SS,ESP 到内核栈,否则不需要保存,然后再保存 eflags,cs,ip 到内核栈中,如果有错误码,还要将错误码压进栈中
根据中断描述符中的段选择子再去 GDT 中索引相应的段描述符得到段基址,与中断描述符里的段偏移量结合起来找到中断处理的入口
CPU 执行中断处理程序
执行完后 iret 返回,就是出栈和恢复上下文的一些列过程。
变量名必须由4个字符组成,第1个字符不能是数字
b) 变量名和函数名不区分大小写
c) Scope和Device都会形成自己的作用域,类似于C++中的namespace和class
d) 所有以”_”开头的函数都是Reserved的,给系统使用,不能给自己的函数起这样的名字
e) ASL中的路径有相对路径和绝对路径之分。其结构有点像文件目录。
f) 对于函数,最多只能传递8个参数(Arg0~Arg7),只能用这8个名字,不能自己起名字
g) 对于局部变量,最多能使用8个变量(Local0~Local7),和函数参数一样,不能自己起名字,而且在使用之前必须手动赋初值。
h) 声明变量时不需要显示声明其类型,这一点不同于C和C++。
数据类型
ASL 常用的几种数据类型
a) Integer – 整数 b) String – 字符串 c) Event -- 事件
d) Buffer -- 数组 e) Package – 对象结合
举例:
DefinitionBlock (
"RamDisk.aml",
"SSDT",
2,
"INTEL ",
"RamDisk ",
0x1000
)
{
Scope (\_SB)
{
Device (NVDR)
{
//
// Define _HID, "ACPI0012" NVDIMM Root Device
//
Name (_HID, "ACPI0012")
//
// Readable name of this device
//
Name (_STR, Unicode ("NVDIMM Root Device"))
Method (_STA, 0)
{
Return (0x0f)
}
}
}
}
HID是一种用于与人类进行交互的设备,例如鼠标、键盘、游戏手柄等。HID设备通过发送和接收输入和输出信号来与计算机进行通信。在编程中,HID通常与操作系统的输入子系统进行交互,以便接收和处理来自HID设备的输入信号。
_STA是设备的状态。在编程中,STA通常是设备对象的一个属性,用于表示设备的当前状态。例如,一个STA属性可能有值0表示设备处于禁用状态,值1表示设备处于启用状态。
Method (_STA, 0)
这段代码是 ACPI(高级配置与电源管理接口)中的一个方法。它定义了一个名为 _STA 的方法,接受一个参数为 0。
在这个方法中,我们可以看到 Return (0x0f),它表示返回一个值为 0x0f 的字节。
在 ACPI 中,_STA 方法通常用于返回设备的状态信息。返回的值是一个位字段,每个位表示设备的特定状态。在这个例子中,返回的值为 0x0f,二进制表示为 00001111,可以看到其中的 4 个位都被设置为 1。