ACPI 系统表详细介绍

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

有两种工作模式:

  1. 8259A 模式: 禁用 LAPIC,APIC 直连 CPU
  2. 标准模式: 启用 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。

  • 28
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ACPI MADTACPI(高级配置和电源接口)规范中的一个,用于描述多处理器系统的硬件配置信息。MADT代多处理器APIC描述。在该中,可以找到与多处理器系统相关的信息,如处理器的数量、ID、中断控制器的类型和连接方式等。MADT的结构由固定的头和一个或多个子组成,每个子描述一个处理器或中断控制器。根据引用\[2\],OSPM在加载DSDT(Differentiated System Description Table)创建ACPI命名空间后,会逐个加载SSDT(Secondary System Description Table)。SSDT是DSDT的继续,可以有多个SSDT存在。需要注意的是,附加的只能添加数据,而不能覆盖数据。因此,MADT中的信息对于了解多处理器系统的硬件配置非常重要。 #### 引用[.reference_title] - *1* *3* [Acpi 和 apm](https://blog.csdn.net/faithsws/article/details/5381489)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ACPI Tables](https://blog.csdn.net/CeliaQianhj/article/details/6742852)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值