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

本文介绍了ACPI中的Control Method,作为预定义对象类型,Method支持最多7个输入参数,可接收命名对象、控制方法或表达式。参数传递采用常量引用,不允许修改。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字营”

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值