ACPICA User Guide and Programmer Reference 翻译11

4.2.5对象初始化——AcpiIntializeObjects

        此步完成被装载之后的命名空间中的对象的初始化,然后,初始化并使能运行时通用事件:

  • 初始化所有的操作域。此步利用默认handler——SystemMemory, SystemIO, PCI_Config, andDataTable,执行地址空间中所有的_REG方法。注:在控制方法中定义的操作域直到控制方法实际执行时才得以初始化。
  • 完成复杂对象的初始化(Operation Regions, BufferFields, Buffers, BankFields, and Packages),这些对象在声明时包含了可执行AML代码。
  • 通过执行每个对象上的_STA和_INI方法来初始化所有设备,处理器和热区对象。
  • 初始化FADT定义的GPE块。
  • 执行命名空间中所有的_PRW方法。这些方法识别并定义用于唤醒事件的GPEs。这个类型的GPE绝不会在运行时使能,它们仅仅在系统进入到睡眠态时被使能。
  • 使能所有运行时GPEs。这些GPEs仅仅只能在_REG,_STA和_INI方法运行完之后被使能。这样能确保所有的操作域和所有设备被初始化并准备好。

4.2.5.1 ACPI设备初始化

        在此步,ACPI命名空间中所有的设备、处理器和热区对象都会被初始化。所有设备的_INI方法会被执行,如_STA控制方法表明的那样。(The _INI method is executed for all devices that are present as indicated by the _STA method),这不意味着对实际硬件设备的初始化——此控制方法会进入到实际的硬件设备驱动中。

        横跨整个命名空间,_STA和_INI控制方法会在类型为Device,Processor和Thermal的ACPI对象上运行。被这些控制方法使用的所有操作域将自动会被just-in-time地址空间初始化机制初始化。初始化是通过如下步骤完成的:

  • 一个命名空间分析方法会识别所有包含设备的子树,这些设备有相应的_INI方法。这种方式大大提高了此步的速度并且能够减少操作系统的启动事件。如果设备没有_INI方法,那么,将不会尝试为此设备执行_STA方法。
  • 如果设备有_INI方法,则会为此设备尝试执行_STA方法。
  • 如果在设备的scope中没有_STA方法,则根据ACPI协议,这个设备被假设为存在并且工作正常。
  • 如果_STA方法的标志表明设备不存在但是正在工作,则不执行_INI方法,但是继续检查此设备的子设备。
  • 如果_STA方法的标志表明此设备不存在并且没有工作,则不需要检查此设备的子设备——终止命名空间中此子树的查询。
  • 如果_STA方法的标志表明设备存在,那么尝试执行_INI方法。
  • 每次执行完_INI方法后,全局初始化handler都会被调用。

4.2.5.2其它ACPI对象初始化

        此步初始化剩下的在设备和地址空间初始化过程中没有被初始化AML操作域和Fields。

        Operation Regions 和 CreateField ASL声明可以包含可执行的AML代码,因此,对对象的初始化要被推迟到ACPICA子系统和ACPI硬件都被初始化之后。在之前的步骤中,一些与此阶段的初始化可能已经完成。此步会完成对其它ACPI对象的初始化。

        对装载的ACPI表的最后一轮的解析将会执行在之前阶段中按照要求没有被执行的控制方法之外的所有AML代码。这样做的目的是同过执行所有的CreateField, OperationRegion 代码来初始化所有的Field and OpRegion 对象。ACPI2.0会使用这种方法来初始化其它对象(目前还没有实现)。

4.2.6其它操作系统 ACPI相关的初始化

        所有ACPI外部接口都可用,host OS 可以执行如下初始化步骤:

  • 使用_HID方法枚举设备
  • 装载、配置和安装设备驱动
  • 设备驱动为其它设备空间安装handlers。例如,SMBus,EC,IPMI和自定义地址空间。
  • PCI驱动枚举PCI设备并为2PCI-to-PCI桥安装PCIConfig handler(这会导致子PCI总线的_REG方法执行,等等)。

4.2.7 just-in-time 操作域初始化

        此阶段包含对任意操作域、package、buffers或者field这些在供此时执行的控制方法使用的对象的初始化。例如,一个PCIConfig地址空间的_REG控制方法要使用SystemMemory操作域,这个SystemMemory操作域就会在此时被赋有效值。(操作域和 CreateField 这个ASL语言声明可能包含可执行的AML代码,因此,此类对象的初始化必须在CA子系统和ACPI硬件都完成初始化之后。)

        因此,地址空间是按照它们被使用时的顺序被初始化。不是以它们在ASL源码中声明的顺序被初始化。

        当所有地址空间都被初始化,则与这些地址空间相关的控制方法_REG(如果有这个方法的话)也会被执行。

4.2.7.1 SystemMemory 域初始化

        对于SystemMeory地址空间中的任一操作域,都维护一个最大值为ACPI_SYSMEM_REGION_WINDOW_SIZE的内存映射窗口,如果整个区域很大的时候,这样能够最简化映射整个区域的操作。

        如果收到大于当前窗口值的请求时,现存的映射会被删除,符合请求的新的映射会被建立。

4.2.7.2PCI_Config 域初始化

        对于这些操作域,命名空间会从操作域向上搜索以找到对应的PCI根桥(PCI Root Bridge)。

        如果设备对象中的_HID控制方法或者_CID控制方法表明是一个PCI根桥(ID为 PNP0A03或者PNP0A08),则对该桥执行PCI配置空间初始化操作。在此桥上安装PCI地址空间handler(和所有子桥上),并且如果存在_REG控制方法的时候,执行_REG控制方法。然后执行_ADR、_SEG和_BBN控制方法(在桥的scope内)来获取PCI设备、功能、段和总线号。最后,执行相关的_REG控制方法来表明此域可用。

  • 初始的PCI设备和功能值可以由_ADR控制方法得到。
  • 初始的PCI段号可以由_SEG控制方法得到。
  • 初始的PCI总线号可以由_BBN控制方法得到。
  • 最终的包含设备号、功能号、段号和总线号的PCI ID可以通过调用AcpiHwDerivePciId这个OSL接口得到。这个函数会根据PCI设备数和PCI配置空间寄存器来调整总线号、设备号和功能号。这样,能够根据硬件配置和初始化允许总线号有个动态值。

        在进入PCI_Config操作域之后,所有对PCI配置空间的操作都可以通过调用AcpiOsReadPciConfiguration和AcpiOsWritePciConfiguration这两个OSL接口来实现

        函数AcpiHwDerivePciId(内部)为一个PCI设备产生一个完整的PCI ID,这个ID包含 段号、总线号和设备号。

        PCI硬件会根据在系统初始化时发现的总线拓扑结构动态配置PCI总线号。在配置PCI_Config操作域期间,ACPICA子系统会调用函数AcpiHwDerivePciId来更新PciId中的总线号,这个新的实际的总线号是由硬件和操作系统决定的。参数PciId最初由ACPICA子系统在初始化操作域期间赋值。然后,ACPICA会调用AcpiHwDerivePciId。这个函数会对现在的硬件和操作系统的情况对PCI ID的子域段号、总线号和设备号进行必要更新。

4.2.8 系统关机-AcpiTerminate

        此步骤释放所有动态分配的资源到主操作系统。此后,ACPICA子系统可以随时重新初始化和从新开始。

       

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值