编程语言
首页 > 编程语言> > 《UEFI内核导读》之ACPI编程入门 第4章:方法(Method)

《UEFI内核导读》之ACPI编程入门 第4章:方法(Method)

作者:互联网

固件C字营·版权所有

敬请关注微信公众号:“固件C字营”

===================================================================== 


第4章:方法(Method)

       Control Method是ACPI/ASL预定义的一种对象类型(ObjectType)为8的对象。它可以调用或者被其他的Method调用,在调用过程中可以被阻塞但不能被抢占,当一个Method被阻塞时OSPM可以转而执行其他的Method。以下称之为“方法“或“Method”。

       Method支持输入最多7个输入参数(Arg0- Arg6)或无输入参数,ArgX分三种类型。其中控制方法类(control method)和表达式(ASL expression)类的ArgX在Method对其使用完后,自动对其进行删除操作。三种ArgX类型分别为:

  1. 命名的对象(named object):把不同类型的对象当做参数传递给Method
  2. 控制方法(control method):执行ArgX绑定的方法,把返回值当参数传入到调用Method
  3. 表达式(ASL expression):先计算表达式,再把结果传入Method。

       Method调用时参数采用常量引用的方式传递(call-by-reference-constant),意味着在调用过程中不会复制参数,而是直接引用参数,且参数不能被修改,这样既减少了在OS启动过程中对内存的频繁访问,也可以防止对对象的意外修改。在Method内部修改ArgX不会修改到调用前的原对象。

       如果使用RefOf算子来引用对象,并通过ArgX传递到Method内部,这个时候对引用对象到修改就会覆盖原始对象,也就达到了对原始数据进行修改目的。

       当Buffer对象(ObjectType=3)或Package对象(ObjectType=4)被当做ArgX传递到Method,使用间接的Index或Field去访问Buffer或Package内部成员时会覆盖其内部数据。

        Method支持最多8个局部变量对象(Local0-Local7),其初始值为NULL。可以使用预定义的Name ( ObjectName, Object )方法来在全局ACPI名字空间(Global ACPI namespace)创建名为ObjectName的新对象。下例创建了3个对象,其作用域分别是:

\\XYZ.BAR:静态对象,该对象所在地ASL被OSPM加载之后就一直存在

\\XYZ.FOO.BAR:动态对象,第#7行Name (BAR, 7)执行完之后才被创建

\\XYZ.FOOB:动态对象,第#9行Name (XYZ.FOOB,3)执行完后被创建,method退出后就被毁。

        Method可以访问系统中的各种资源或操作空间(Operation Region),也可以进行数学运算及其他运算,进而完成特定的任务。操作空间包括:内存、IO、PCI配置空间、EC、SMBUS、CMOS、PCIBar,IPMI、GPIO、SerialBus、PCC、OEM自定义空间。数学运算包括:四则运算(加减乘除)、逻辑运算(逻辑与或非)、位运算(移位、位与或非)等

 

固件C字营·版权所有

敬请关注微信公众号:“固件C字营”

 

标签:ArgX,调用,对象,XYZ,ACPI,参数,UEFI,Method
来源: https://blog.csdn.net/CStyle_0x007/article/details/121412056