ACPI 表的提取和更新方法

主要介绍DSDTSSDT的提取、反编译、修改、编译和更新的方法。

提取

1
2
acpidump > acpidump
acpixtract -a acpidump

这一步会在当前目录下生成许多dat文件。

反编译

1
iasl -d *.dat

这一步会把上一步生成的dat文件反编译为dsl文件。

修改

现在就可以按照需求修改dsl文件。

注意:修改完后,需要增加版本号。

例如:
修改前:

1
DefinitionBlock ("DSDT.aml", "DSDT", 2, "INTEL ", "TEMPLATE", 0x00000000)

修改后应为:

1
DefinitionBlock ("DSDT.aml", "DSDT", 2, "INTEL ", "TEMPLATE", 0x00000001)

编译

例如我们修改了dsdt.dsl文件,可以这样编译:

1
iasl -sa dsdt.dsl

此时应该会生成dsdt.aml

如果修改过其他文件,也可以按照上述方法进行编译,生成相应的aml文件。

应用修改

1
mkdir -p kernel/firmware/acpi

然后复制相应的aml文件到上面新建的目录。

1
2
find kernel | cpio -H newc --create > initrd
cat /boot/initrd >> initrd

再用当前目录下生成的initrd替换系统原来的initrd,重启系统。

如果能在demsg中发现类似

1
ACPI: DSDT ACPI table found in initrd

的信息,则说明替换成功。

参考

https://www.kernel.org/doc/html/latest/admin-guide/acpi/initrd_table_override.html
https://wiki.archlinux.org/title/DSDT_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)