怎么了选择
分类: Windows平台
2018-01-04 17:30:39
1ACPI table 在BIOS 里面用ASL code 去描述。而ACPI Table又分成不同类型的Table(RSDT/FADT/DSDT...etc).
2像是我们比较常使用的DSDT Table就是放了一些event code.简单说就是当某个H/W event发生后,系统会依照
描述在这个DSDT Table中的ASL code去执行,而这些Acpi Table 包在BIOS ROM 中的形式是AML Code (类似
机器码)。
3. BIOS在开机过程中会把包在BIOS ROM中的Acpi Table 载入到RAM中,然后留下一些信息给OS来找到他们,
最简单的例子就是RSDP Structure会放在1M以下的某个位置(一般是E0000h~FFFFh),然后OS就可以透过搜寻
Signature(某个标记字)的方式来找到其他的Acpi Table entry point。
4. OS 需要有一个AML翻译器去翻译这些AML code,然后去执行他们。
5.每个 Platform 的host controller的寄存器位置不同,所以BIOS需要透过ACPI Table来告知OS这些寄存器的
位置,这样子做的好处是OS不需要知道你是在什么Platform,因为他只单纯看BIOS所提供的HW信息。
结合ASL代码学习ACPI
1.从 _STA 说起.
_STA 描述了一个设备的当前状态,比如说它可以告诉操作系统某个device 是否存在,或者说,是否要show出来。具体参考ACPI spec 6.3.7(version 6.0)
这个object 描述了某个device 的当前状态,它可以是这三种情况:enabled, disabled 或者removed.
OSPM(其实就是OS) 在调用 INI 之前会先执行_STA 这个method. 先检测到它存在了,再去初始化它,不存在,也就没有初始化一说了。
如果某个device 下面,没有放这个_STA method ,我们默认它是存在并且正常工作的。
参数:
None
返回值:
Bit[0] 如果device 存在将会被置起
Bit[1] 如果device 被置起,并且decode 到相应的resource
Bit[2] 如果希望将其在UI中show出来,那么将这一位置起
Bit[3] 如果能正常工作,这一位会被置起。
Bit[4] 如果电池存在,置起这一位
Bit[31:5] 保留起来,以后用
动动手:一个小实验
这张图截自windows 设备管理器,他显示了系统下有哪些device.
如果你想其中某个隐藏起来,就在asl code 中找到它(比如通过hid). 然后在下面写一个_STA 方法,返回全0.
加几句,写成:
然后,看看结果,是不是看不到RTC了?
FAQ?
谁去调用这些ASL code 中的这些method?
OS.
随便打开一份ACPI compatible (Linux , windows )的源代码,搜索_STA
ReactOS-0.3.14\drivers\bus\acpi\acpica\namespace\nsxfname.c (取自ReactOS)
有这么几行
2. OS 如何找到ACPI table?
通过RSDP 这个signature