C/C++教程

《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字营”

 

这篇关于《UEFI内核导读》之ACPI编程入门 第4章:方法(Method)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!