固件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类型分别为:
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字营”