如何在 Windows 上修改 ACPI 表

如何在 Windows 上修改 ACPI 表

总之,我的问题是:如何在 Windows 上修改 ACPI 表?

更多详细信息:我在新的 hp envy x360 Ryzen 3700U 上以双启动方式安装 ubuntu 18.04 时遇到问题。我在这里找到了答案: https://askubuntu.com/questions/1162746/why-wont-my-hp-envy-x360-laptop-with-ryzen-7-3700u-boot-ubuntu-live-cd;这涉及修改 ACPI 配置。

我做了以下事情(正如“justin”在https://bugzilla.kernel.org/show_bug.cgi?id=203431):

1. run "acpidump -o tables" to create a file with the currently running tables
2. "acpixtract -a tables" to extract the individual tables (we only care about the FACP table)
3. "iasl -d facp.dat" to disassemble the FACP table
4. edit facp.dsl with your prefered text editor. 
set the "Oem Revision" field at the top to a larger number
set the "Hardware Reduced (V5)" field to 0
5. "iasl -sa facp.dsl" to assemble your modified table
6. install the produced facp.aml file like you did before

我认为前 5 个步骤进展顺利。我被困在最后一部分,因为我不明白我应该做什么(安装生成的 facp.aml):
从我在第一个线程中收集到的信息来看,我必须使用 FACP.aml 文件创建一个 CPIO 存档并将其提供给 initrd 内核。我不知道该怎么做,因为我找到的所有资源都是针对 Linux 的,而不是针对 Windows 的。有人能用更简单的话解释一下吗?

根据教程https://acpica.org/,我必须运行“acpiexec facp.aml”。我这样做了,但得到了以下结果:

Intel ACPI Component Architecture                                                                                       
AML Execution/Debug Utility version 20190816                                                                            
Copyright (c) 2000 - 2019 Intel Corporation       

Input file facp.aml, Length 0x114 (276) bytes                                                                                                                                                                                                   

ACPI: RSDP 0x000000000041C7B8 000024 (v02 Intel )                                                                       
ACPI: XSDT 0x00000000004714A8 000034 (v00 Intel  AcpiExec 00001001 INTL 20190816)                                     
ACPI: FACP 0x0000000000472490 000114 (v06 HPQOEM SLIC-MPC 01072009 INTL 20190816)                                       
ACPI: DSDT 0x000000000041A378 000024 (v02 Intel  Local    00000001 INTL 20090730)                                       
ACPI: FACS 0x000000000041C918 000040        

ACPI table initialization:                                                                                              
Table [DSDT: Local   ] (id 01) -    0 Objects with   0 Devices,   0 Regions,    
0 Methods (0/0/0 Serial/Non/Cvt)        
ACPI: 1 ACPI AML tables successfully acquired and loaded                                                                                                                                                                                        

Final data object initialization:                                                                                       
Namespace contains 9 (0x9) objects                                                                                      
Initializing General Purpose Events (GPEs):                                                                                 
Initialized GPE 00 to 1F [_GPE] 4 regs on interrupt 0x9 (SCI)                                                       
Initializing Device/Processor/Thermal objects and executing _INI/_STA methods:                                              
Executed 0 _INI methods requiring 0 _STA executions (examined 2 objects)                                            
Unexpected AE_BAD_ADDRESS from AcpiWriteBitRegister (aetests-550)                                                       
Unexpected AE_BAD_ADDRESS from AcpiReadBitRegister (aetests-563)                                                        
Unexpected AE_BAD_PARAMETER from AcpiInstallGpeHandler (aetests-412)                                                    
Unexpected AE_BAD_PARAMETER from AcpiEnableGpe (aetests-415)                                                            
Unexpected AE_BAD_PARAMETER from AcpiDisableGpe (aetests-418)     

即使我在未修改的 .aml 文件上运行此命令,它也不起作用,尽管在这种情况下我没有得到意外的 AE_BAD_ADDRESS 和意外的 AE_BAD_PARAMETER 行。

因为我是一个完全的初学者,我不知道自己在做什么,所以非常感谢一个易于理解的解释!

答案1

我已经成功启动了 Ubuntu Budgie(Live 系统,未安装),使用相同的 Envy 型号和处理器,键盘、触控板和触摸功能均正常。

像你一样提取 ACPI 表,但在第 4 步中,你需要编辑一行,你想更改

 8042 Present on ports 60/64 (V2) : 0

8042 Present on ports 60/64 (V2) : 1 

这是为了让触控板和触摸屏工作。然后按照下一步编译您的 FACP.dsl 文件。

为了安装它,您需要将其放入 Linux 可启动闪存驱动器内的 initrd 中。

为了做到这一点,您需要执行下面的 Linux 命令,我使用 Windows Subsystem for Linux (WSL) 来方便地实现该目的。

创建 Linux 可启动闪存驱动器(在 ISO 模式下)。将 initrd(在 ubuntu 中位于 /casper)复制到计算机上新创建的文件夹,您还需要将 facp.aml 文件移动到同一文件夹。

在该文件夹中打开 Linux shell 并执行这些命令;

# mkdir -p kernel/firmware/acpi 
# mv facp.aml kernel/firmware/acpi
# find kernel | cpio -H newc --create > instrumented_initrd

最后

cat initrd >>instrumented_initrd

现在将此文件(instrumented_initrd)移动到可启动驱动器内的 /casper 文件夹中,将其重命名为 initrd(删除已检测)并单击“是”进行替换。

就我而言,这使得我的计算机成功启动 Ubuntu Budgie,并且键盘、触控板和触摸屏都可以工作。

答案2

您可以按照此线程中的说明安装 Ubuntu 的全新副本:

启动 Ubuntu Live CD

接受答案中的方法 1 应该允许您启动新安装。方法 2 应该允许您使其完全正常运行。

您可以使用此处的工具转储 Windows 中的 ACPI 表:

ACPI 工具 Windows 二进制文件

要从 CLI 使用它们:

$ acpidump -b
$ iasl -d facp.dat

现在用文本编辑器修改 facp.dsl。将“减少硬件支持”从 1 更改为 0。

重新编译 facp.dsl

$ iasl -sa facp.dsl

请参阅此帖子:在 Linux 中加载自定义 ACPI 表

要创建 cpio 档案,请按照下列步骤操作:

# mkdir -p kernel/firmware/acpi
# mv facp.aml kernel/firmware/acpi
# find kernel | cpio -H newc --create > my_tables.cpio

编辑 /boot/grub/grub.cfg。其中显示:

initrd <kernel>

您需要添加一行引用 cpio 存档。您可以尝试启动高级模式并添加 echo 行,以便验证它是否正在加载修改后的表:

echo 'Loading custom ACPI table ...'
initrd /my_tables.cpio
initrd <kernel>

我还没有时间在新笔记本电脑上安装 Ubuntu,因此我无法亲自验证这些说明是否对我有用。一旦有时间进行安装,我将发布更新。

相关内容