前言
最近一直在忙项目,需要跟固件的同事打交道。
在Linux中,目前设备的信息很多是通过ACPI表描述的,而这个ACPI表是需要固件写入的,我们操作系统驱动没办法控制。在调试的过程中,经常会遇到在不同的机器上面,驱动执行不一致的问题。驱动代码都是同一份的,不同的就是固件了。而固件内部,除了一些硬件寄存器配置外,就是ACPI表的描述了。很多时候,不晓得别人是不是给你描述对了,与其去问,还不如自己动手去看ACPI表了。
上网查了一下,get一个新技能。
ACPI表
APCI, Advanced Configuration and Power Interface,高级配置与电源接口,是BIOS到操作系统的一系列接口,ACPI接口中包含了很多预定义的表格,这些表格的定义存储在BIOS芯片中,由BIOS生成到内存中提交给操作系统,各种不同的操作系统都可以提取BIOS提交的原始ACPI表格文件,其中最重要的就是DSDT和SSDT表格。
DSDT,Differentiated System Description Table,差分系统描述表,包含大部分硬件信息的主体表格。
SSDT,Secondary System Description Table,辅助系统描述表,包含少部分硬件补充信息的表格。
APCI表解析
在系统目录/sys/firmware/acpi/tables
下存储了ACPI表信息,不过这个是不能够明文查看的,需要使用工具解析。这个工具就是iasl, 这是一个编译和解析ACPI的工具,一般系统中没有,需要自行安装。
apt install iasl
# 拷贝APIC文件
cp /sys/firmware/acpi/tables/DSDT /tmp
# 解析DSDT文件,输出 DSDT.dsl
cd /tmp
iasl -d DSDT
root@VirtualBox:/tmp# ls
DSDT DSDT.dsl
打开dsdt.dsl, 找到对应的device,可以看到具体的描述。
上面我们从/sys/firmware/acpi/tables拷贝了DSDT表文件到/tmp目录。其实,我们也可以使用acpidump工具直接生成表文件
apt install acpidump
acpidump -n DSDT -b # 生成DSDT表文件 dsdt.dat
iasl -d dsdt.dat #
root@keep:/tmp/812# iasl -d dsdt.dat # 生成dsdt.dsl文件
Intel ACPI Component Architecture
ASL+ Optimizing Compiler/Disassembler version 20190509
Copyright (c) 2000 - 2019 Intel Corporation
File appears to be binary: found 2605 non-ASCII characters, disassembling
Binary file appears to be a valid ACPI table, disassembling
Input file dsdt.dat, Length 0x1B46 (6982) bytes
ACPI: DSDT 0x0000000000000000 001B46 (v02 PHYLTD PHYTIUM. 00000001 INTL 20180629)
Pass 1 parse of [DSDT]
Pass 2 parse of [DSDT]
Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
Parsing completed
Disassembly completed
ASL Output: dsdt.dsl - 59176 bytes
acpidump -s # 可以查看当前apci所有的表
除了iasl, 还可以使用acpidump工具。
更多
重启学习历程!
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
博客地址: fishmwei.github.io
掘金主页: juejin.cn/user/208432…