《UEFI内核导读》之ACPI编程入门 第7章:特殊对象与类型

本文主要介绍了ACPI中特殊对象ArgX和LocalX的使用,包括读写数据的操作,以及Name对象、RefOf、DerefOf、Store和CopyObject等算子的功能和应用。这些内容对于理解ACPI编程至关重要。

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

固件C字营·版权所有·欢迎转载

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

敬请关注QQ群:1052307

敬请关注优快云博客:Cstyle_0x007

图片=====================================================================


          ACPI/ASL支持一些预定义的对象类型和算子,它们有一些不同于其他对象的特性,极容易造成混淆,本章节对他们进行简单介绍。

  • ArgX(Method Argument Data Objects)

参数数据对象,用来向Method传递参数,作用域在Method内且只能用于传递参数使用。分为Arg0-Arg6共7个。

从ArgX参数读数据:

  1. ObjectReference:类似DeRefOf效果,自动进行“去引用”,返回被引用的对象
  2. Buffer:返回Buffer,可以用相关算子算子创建Index、Field、Buffer引用对象
  3. Package:返回Package,可以创建Index或Package引用对象
  4. All other object types:返回对象

         例:MTHD (RefOf (Obj), Buf, Pkg, Obj)此方法有4个参数,分别是:Arg0为引用类型、Arg1为Buf类型、Arg3为Pkg类型、Arg4为一般对象。

往ArgX参数写数据:

  1. ObjectReference objects:类似DeRefOf效果,自动进行“去引用”,复制并覆盖最终目标对象,ArgX赋值为最终目标对象的引用。
  2. All other object types:用复制的对象覆盖ArgX。

  1. LocalX(Method Local Data Objects)

本地数据对象,只能在Method作用域内使用,分为Local0-Local7共8个。

LocalX变量读数据:

  1. ObjectReference:返回对象引用,若使用DeRefOf则返回原对象
  2. All other object types:返回对象

LocalX变量写数据:

  1. All object types,先删除LocalX保存的对象,然后复制原对象到LocalX

  • Name ( ObjectName, Object )

在全局ACPI名字空间(Global ACPI namespace)创建一个对象,对象名为ObjectName,该对象名是对“Object”的引用。

从Name对象读数据:

  1. ObjectReference:返回对象的引用,若使用DeRefOf则返回对象。
  1. All other object types:返回对象

往Name对象写数据:

  1. All object types :先删除Name保存的已存的对象,然后复制原对象到Name。Store算子会先使用隐式类型转换,把源对象转换成与Name匹配的类型,CopyObject算子不执行隐式类型转换。

  • RefOf (Create Object Reference) RefOf (Object) => ObjectReference

创建一个对目标Object的引用对象。如果被引用的对象不存在则报错。通常用在调用Method的时候向Method传递参数,使用RefOf可以避免在OSPM加载Method的时候同时对对象进行求值计算,进而避免资源访问冲突。例如:对EC的访问。

  • CondRefOf (Create Object Reference Conditionally)  CondRefOf (Source, Result) => Boolean

类似RefOf区别是在引用对象时判断对象是否存在,若不存在则返回failure,否则返回True

  • DerefOf (Dereference an Object Reference)  DerefOf (Source) => Object

作用与RefOf相反,解除对象引用,如果操作数Source是一个被引用的对象,则返回原对象。若操作数Source是字符串,则返回当前作用域内以该字符串命名的对象。如果操作数Source找不到则报错。若操作数Source是使用Index()算子创建的并且引用的是未初始化的Package成员则会报错。

  • Store (Store an Object)  Store (Source, Destination)

计算原对象Source的值,把结果转换成目标对象Destination类型,并把结果存储到目标对        象。不得把只读对象做为目标对象Destination。

  • CopyObject (Copy and Store Object) CopyObject (Source, Destination) => DataRefObject

        把原对象Source转换成DataRefObject引用类型,然后直接覆盖目标Destination对象。若        目标对象已经被初始化为DataRefObject引用类型,则被目标对象引用的原对象将被        Source对象覆盖。

存储其他类型到目标类型

使用"Store"的算子
Store(Source,ArgX)
Store(Source,LocalX)
Store(Source,FIELD)
Store(Source,NAME)

使用“CopyObject”算子
CopyObject(Source,ArgX)
CopyObject(Source,LocalX)
CopyObject(Source,FIELD)
CopyObject(Source,NAME)

Method ArgX

ArgX使用Source类型存储,若ArgX是对其他的对象的引用(RefOf)则自动进行”去引用DerefOf “,复制Source覆盖ArgX引用的原对象,ArgX的值为复制后的对象的引用

同Store一致

Method LocalX

LocalX使用Source类型存储,即使LocalX是对其他对象的引用,也直接覆盖并存储到LocalX

同Store一致

Field Unit or BufferField

先对Source进行隐试类型转换,再存储到FIELD

Field类型不可被改变,只有整形或Buffer类型可以使用CopyObject(Source,FIELD)

Named data object

先对Source进行隐试类型转换,再存储到NAME

Source和Source类型都被复制到NAME

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

固件C字营·版权所有·欢迎转载

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

敬请关注QQ群:1052307

敬请关注优快云博客:Cstyle_0x007

图片=====================================================================

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值