=====================================================================
固件C字营·版权所有·欢迎转载
敬请关注微信公众号:“固件C字营”
敬请关注QQ群:1052307
敬请关注CSDN博客:Cstyle_0x007
=====================================================================
ACPI/ASL支持一些预定义的对象类型和算子,它们有一些不同于其他对象的特性,极容易造成混淆,本章节对他们进行简单介绍。
- ArgX(Method Argument Data Objects)
参数数据对象,用来向Method传递参数,作用域在Method内且只能用于传递参数使用。分为Arg0-Arg6共7个。
从ArgX参数读数据:
- ObjectReference:类似DeRefOf效果,自动进行“去引用”,返回被引用的对象
- Buffer:返回Buffer,可以用相关算子算子创建Index、Field、Buffer引用对象
- Package:返回Package,可以创建Index或Package引用对象
- All other object types:返回对象
例:MTHD (RefOf (Obj), Buf, Pkg, Obj)此方法有4个参数,分别是:Arg0为引用类型、Arg1为Buf类型、Arg3为Pkg类型、Arg4为一般对象。
往ArgX参数写数据:
- ObjectReference objects:类似DeRefOf效果,自动进行“去引用”,复制并覆盖最终目标对象,ArgX赋值为最终目标对象的引用。
- All other object types:用复制的对象覆盖ArgX。
- LocalX(Method Local Data Objects)
本地数据对象,只能在Method作用域内使用,分为Local0-Local7共8个。
从LocalX变量读数据:
- ObjectReference:返回对象引用,若使用DeRefOf则返回原对象
- All other object types:返回对象
往LocalX变量写数据:
- All object types,先删除LocalX保存的对象,然后复制原对象到LocalX
- Name ( ObjectName, Object )
在全局ACPI名字空间(Global ACPI namespace)创建一个对象,对象名为ObjectName,该对象名是对“Object”的引用。
从Name对象读数据:
- ObjectReference:返回对象的引用,若使用DeRefOf则返回对象。
- All other object types:返回对象
往Name对象写数据:
- 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"的算子 | 使用“CopyObject”算子 |
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
敬请关注CSDN博客:Cstyle_0x007
=====================================================================