5.5.2.2. 方法调用约定
控制方法的调用约定可以最好地描述为“按引用调用常量”。在此约定中,作为参数传递的对象通过“引用”传递,这意味着它们在传递给被调用的控制方法时不会复制到新对象(在调用期间复制对象或对象包装器的调用约定称为按值调用或按复制调用)。
这种按引用常量调用约定允许在每个方法调用之间共享内部对象,从而减少必须执行的对象复制数量以及必须复制的缓冲区数量。此调用约定适合主机操作系统内核中ACPI子系统的低级性质,其中非分页动态内存通常非常宝贵。 ASL程序员必须了解调用约定和相关的副作用。
然而,与纯粹的引用调用约定不同,被调用的控制方法修改参数的能力极其有限。这可以减少别名问题,例如当被调用的方法意外修改调用者作为参数传递的对象或变量时。实际上,传递给控制方法的参数作为常量传递,除非在特定的受控环境下,否则无法修改这些常量。
通常,通过 ArgX 术语传递给控制方法的对象不能由被调用的方法直接写入或修改。换句话说,当 ArgX 项用作ASL语句中的目标操作数时,现有的 ArgX 对象不会被修改。相反,新对象会替换现有对象,并且 ArgX 术语实际上成为 LocalX 术语。
只读参数规则的唯一例外是 ArgX 术语包含通过 RefOfASL 运算符创建的对象引用。在这种情况下,使用 ArgX 项作为目标操作数将导致存储在 RefOf 操作引用的ACPI名称中的任何现有对象被覆盖。
在某些有限的情况下,可能会创建一个新的可写对象,该对象将允许控制方法更改 ArgX 对象的值。这些情况仅限于 Buffer 和 Package 对象,其中对象的“值”是间接表示的。对于缓冲区,可以创建一个可写索引或字段来引用原始缓冲区数据,并允许被调用的方法读取或修改数据。对于包,可以创建可写索引以允许被调用的方法修改包的各个元素的内容。