3.2.4异常处理
所有在对ACPICA子系统的请求的处理过程中发生的异常都以ACPI_STATUS为返回码返回到调用者。所有ACPICA的异常都是以“AE_”开头,例如,AE_OK表示请求执行成功。
所有异常处理都由调用者内联到ACPICA子系统接口中。对于以Acpi和AcpiOs开头的调用没有异常处理函数与之关联。
3.2.5 多任务和可重入
ACPICA子系统的所有组成部分都应该是可重入的并且支持多线程的。为了实现可重入和多线程,OSL必须根据特定的主操作系统的操作原语实现互斥访问接口,以保证能够正常使用同步和异常访问。尽管依赖与这写互斥访问接口的实现,然而ACPICA子系统的所有组成部分都是可重入和支持多线程的。AML翻译器是个例外。解释如下。
由于ACPI协议的约束,AML翻译器并发性的实现有很大的限制。协议规定在任意时间,最多只能有一个控制方法能够执行AML代码。如果一个控制方法执行时被阻塞(在一些限制条件下是可能发生的),其它的控制方法应该可以执行。不管怎样,可以说ACPI协议妨碍了控制方法的并发执行。因此,在ACPICA子系统的所有组成部分中,AML翻译器是单线程的。对与对控制方法的内部或者外部请求的串行化是由翻译器的前置部分完成的。
3.2.6 事件处理
词语“事件处理”宽泛的指在ACPICA子系统执行过程中的异步事件。这些事件包括:
- 由ACPI固定的和通用事件触发的SCI
- 执行ASL中的Notify关键字表示的控制方法而触发的通知事件
- 在执行控制方法的过程中,由于进入地址空间或者操作域而触发的事件
对于每个事件的描述以及ACPICA子系统对于这些事件的支持,下面将进行详细的描述。
3.2.6.1 固定事件
固定事件由ACPICA子系统默认事件处理handler处理,对于每个事件,可以安装单独的handler。只有设备驱动和系统服务需要安装此类的handler。
3.2.6.2通用事件
通用事件通常是通过执行与事件相关的控制方法来进行处理的。根据ACPI协议,每一级别的GPE都能有相应的控制方法与之对应。这些控制方法中,以_Exx为名字的是边沿触发方式,以_Lxx为名字的是电平触发方式。xx是以十六进制表示的GPE的级别(详见ACPI协议)。这个控制方法不会在SCI中断handler的上下文执行,但是会被主操作系统入队列以延后执行。
除了这种机制,对于不同级别的GPE可以有单独的handler,这不是强制性的,实际上,现在需要独立的GPE handler的设备只有ACPI EC。EC的驱动会为属于EC 的GPE安装独立handler。
如果GPE安装了handler,handler会使用优先级而不会使用_Exx/_Lxx控制方法。
还支持GPE块设备(GPE Block Devices)。根据需要,这些块嫩够被动态的安装和卸载。ACPICA子系统嫩够对GPE集中处理和分派,并且提供了必要的接口来安装和卸载GPE块设备。