BIOS知识枝桠——ACPI

ACPI在BIOS中的应用

  • ACPI Overview
    • Power State
    • ACPI Table
      • XSDT
      • FADT
  • ASL Code
    • 变量和运算
    • 函数

ACPI Overview

完全解读:Advanced Configuration and Power Interface
Advanced:为什么说它是advanced呢,主要是它替代了以前的APM,APM全称是 Advanced Power Management(高级电源管理),他是一种基于BIOS的系统电源管理方案,它提供CPU和外设电源管理并通过设备工作超时设定来决定何时将设备切换到低功耗模式。目前最新的版本是1.2,相对于1.0和1.1版来说,最新版的APM方案由操作系统来定义管理实践,实际的执行动作还是由BIOS来做。由于缺陷逐渐明显,ACPI就产生了。
Configuration and Power:说明这个接口的作用,配置和电源相关
Interfac:表明是个interface, 一种工业标准规范或接口,连接OS, BIOS, 驱动和硬件

电源管理是做什么的:通过Event 进行low power state和normal working state的相互切换
在这里插入图片描述
当sleepbutton按下以后,SLPBTN_STS寄存器会被置1,SLPBTN 是默认置1,这样就会产生Event ,进行一系列动作保证系统按照下面的设置进行电源的控制。
BIOS知识枝桠——ACPI_第1张图片
下图展示OSPM/ACPI相关软、硬件组件以及它们彼此之间的关联。
• 虚线框起来的,是ACPI规范所涉及的,主要有三部分组成: ACPI Registers, ACPI BIOS, ACPI Tables

BIOS知识枝桠——ACPI_第2张图片

Power State

全局状态(Global System States)

电源状态是系统或设备的各种省电状态的统称, 类似于S3, S4等
G0 Working, G0 = S0, 系统正常执行状态
G1 Sleeping,消耗少量的电源,不需要重新启动就可以直接回到working状态
G2 Soft Off, G2 = S5,即关机状态,相对于G3来说,插了电源,需要重新启动系统才能进入working状态
G3 Mechanical Off, 所有的电都拔掉,可以任意拆机 (注意RTC)
BIOS知识枝桠——ACPI_第3张图片
S0, 正常工作状态
S1,Sleeping with processor context maintained,其实就是Windows下的standby。CPU停止工作,不执行指令,但是,CPU, Chipset 以及RAM内容没有丢。此状态可以快速恢复到working状态。
S2,类似S1,比S1睡的更深,更省电。CPU停止工作, CPU和Cache上下文内容丢失,RAM处于带电状态。(基本不会接触)
S3,suspend to RAM, 除了内存外的其它电源,如CPU, chipset 都移除。除了内存外,未保存其它所有系统上下文,如CPU, Cache, chipset等。系统内容和状态暂存于RAM中,如果wake event发生,BIOS不会再初始化CPU, chipset, RAM,而是直接从S3中恢复系统。RAM带电,如果电源掉电,RAM内容丢失。
S4,suspend to disk, 电源完全关闭,系统内容和状态储存disk,当系统收到唤醒信号后,首先从Disk中恢复memory. 电源掉电,内容不丢失。
S5,soft off, 电源完全关闭,相对于S4来说,系统内容和状态不被储存,需要一个完整的启动过程才能到工作状态。

Device state设备电源状态

D0(Fully-On),device电源消耗最大状态,工作状态,设备可以完全操作和响应(The device is completely active and responsive),设备可以记住上下文(context)。
D1(Optional),比D2耗电,定义依不同device而不同。
D2(Optional),比D1更省电的状态,定义依不同device而不同。
D3(Off),device电完全移除,device context 丢失,要到D0状态必需OS software重新对其初始化。

CPU state

C-state是APIC SPEC定义的CPU在G0下的power states。这些状态都是在G0下,也就是说是在system active下的。其中只有C0下,CPU才执行指令,其它C状态,
CPU处于sleep状态。
C0,CPU工作中,执行命令
C1,CPU 大部分clock停止,执行halt指令后
C2,CPU clock停止
C3,CPU clock停止,且cache snoop 停止
C4, C5, … C10

Performance state

设备和处理器性能状态,是指设备和处理器在active/executing状态,也就是设备是D0,处理器是C0,在这种情况下对性能的评比。也就是让OSPM在性能和功耗之间找到折中。
P0,当设备或处理器在此状态时,会达到最高的性能,当然消耗的电量也是最大的
P1,在些状态,设备或处理器的性能被限制在最高能力之下,设备或者处理器消耗的电量比P0时小一点。
Pn,在此状态,设备或处理器的性能处于最低,当然,电量消耗也是最少的。n 是性能状态数。

ACPI Table

ACPI table就是一个个在内存中的结构体, 每个结构体都有固定的表头格式 (下图), 以及自己特有的格式
ACPI spec定义了一些固定格式的table, 如XSDT, RSDT, FACP, DSDT等, OEM可以新增属于自己的特殊table, 格式可自定
BIOS知识枝桠——ACPI_第4张图片
常见ACPI table及其关系
BIOS知识枝桠——ACPI_第5张图片
BIOS知识枝桠——ACPI_第6张图片
OS初始化时,OSPM先找到RSDP,然后,再由RSDP中定义的物理地址来定位RSDT or XSDT,再由RSDT or XSDT定位其它table
OSPM是如何找到RSDP的,legacy下,在内存空间0E0000H到0FFFFFH之间找到 RSD PTR; UEFI 下,OS loader找ACPI 的GUID。
BIOS知识枝桠——ACPI_第7张图片

XSDT

Extended System Description Table, XSDT结构以signature “XSDT” 开始,里面有很多指向其它表头的物理地址。这些物理地址是64bit,相对于RSDT的32bit。有了这些地址,就可以找到其它表。在HE.exe 里可以直接查看

BIOS知识枝桠——ACPI_第8张图片
BIOS知识枝桠——ACPI_第9张图片

FADT

Fixed ACPI Description Table, FADT是所有ACPI表中最重要的表。一开始叫FACP,ACPIready都在这个部分里
BIOS知识枝桠——ACPI_第10张图片
FADT包含了很多重要的filed。

  1. Preferred_PM_Profile, 首选的电源管理轮廓,由BIOS填写,装系统时, OSPM根据这个字段来设置默认的电源管理策略。 1, desktop; 2, mobile; 3, workstation; 4, server, …
    以Desktop为例;在ACPI spec的 FADT Format中阐述了每一位的具体作用,结合HE.exe就可以读出该设备是台式机 笔记本或者其他。
    BIOS知识枝桠——ACPI_第11张图片
    BIOS知识枝桠——ACPI_第12张图片

  2. SCI_INT, SCI对应的中断向量,一般是IRQ9

  3. SMI_CMD, SMI 命令所在的系统端口地址, default情况下, intel 是0xb2, AMD 是0xb0

  4. ACPI_ENABLE, 将此值写入SMI_CMD port,用来通知BIOS, OS要由SMI模式切换到ACPI模式。

  5. ACPI_DISABLE, 将些值写入SMI_CMD port,用来通知BIOS, OS要由ACPI模式切到SMI模式

  6. PM1a_EVT_BLK, PM1a_EVT_BLK的port address

  7. PM1b_EVT_BLK, PM1a_CNT_BLK , ……… , GEP1_BLK, 这些都是port address

  8. PM1_EVT_LEN, ……, GPE1_BLK_LEN,这些都是长度

  9. GPE1_BASE,

  10. P_LVL2_LAT, 进入和退出C2状态的最长硬件延时,如果值大于100,则表示不support C2状态。

  11. P_LVL3_LAT, 进入和退出C3状态的最长硬件延时,如果值大于1000,则表示不support C3状态。

  12. IAPC_BOOT_ARCH, OS初始化时,会根据此字段的值判断硬件平台上有没有这些legacy设备,有的话就初始化,没的话,就跳过。 Bit0=1,表示主板支持LPC或ISA总线上挂的设备; Bit1 = 1, 表示主板上有KBC(8042 OR EC);等等

  13. PWR_BUTTON, 表示power button功能是否属于fixed hardware feature

重要性2: 包含了其它两个表的地址,FACS, DSDT。其中DSDT中包含了所有OEM ASL,也就是OEM厂商在BIOS中使用ASL语言定义的自己的对象和控制方法,都可以在DSDT表中找到。

ASL Code

  • ACPI Source Language ASL是一种开发语言,用来定义ACPI对象、编写ACPI控制方法。OEM厂商可以在BIOS中使用ASL语言定义自己的对象和编写自己的控制方法,然后用编译器编译成AML格式,供OSPM使用。
  • OS和驱动会调用ASL code, ASL code之间也会互相调用
  • ASL code和BIOS C code之间无法互相调

语法规则

  • ASL对象(device 、函数、变量都叫对象)的名字由4个字符组成,不足4,编译器自动在后面补’_’
  • 如果第1个字符是’_’,说明是系统自用(reserved)的,在ACPI spec中都有定义
  • 对象名不区分大小写, 一般习惯全部大写
  • 函数参数最多8个,且命名为arg0-arg7, 不能自己命名。
  • 函数中的局部变量也是最多8个,且命名是local0-local7, 不能自己起名字。
  • 注释代码用’//’ 或’/* */’

变量和运算

  • 变量定义 Name
    Name(JINT, 0) //定义一个整数JINT, 赋初值0
    Name(TIEQ, ”Hello,world”) //定义一个字符串,值为“Hello,world”
    Name(XX00, Buffer(0x03){}) //定义一个长度为3的buffer,相当于C语言的 XX00[3]
    Name(_PCL, Package() {_SB} ) //定义一个package,相当于C语言的 struct
    可以看出不需要声明变量的类型
  • 变量传值 Store
    Store(0xc0000, JINT) //將0xc0000赋给JINT
    Store(Local0, TIEQ) //將局部变量Local0的值赋给TIEQ
  • 算术运算
    ASL的算术运算不使用±*/,全部使用函数, 例:
    Add(0x01, 0x02, Local0) //Local0=0x01+0x02
    Not(WLAN_POWER, Local0 ) // Local0=WLAN_POWER按位取反
  • 逻辑运算
    同算术运算一样,也是使用函数,例:
    LAnd(0x1,0x2) //0x1&&0x2

函数

  • 函数定义
Method(JINT, 2) //定义一个函数,函数名是JINT,输入参数有2个
{
  //函数实体
  //Arg0, fist parameter, 无需定义, 可直接用
  //Arg1, second parameter, 无需定义, 可直接用
  Store(Arg0,Local0)
  Store(Arg1,Local1)
  Add(Local0,Local1,Local1)
  Return (Local1)
}
  • 函数调用
    JINT(2, 3)

你可能感兴趣的:(BIOS,acpi,bios)