我正在尝试编写一个内核,并计划在一些问题上使用ACPI (例如,识别APIC上的中断源)。
然而,我真的是一个初学者,我阅读了相关的文档,仍然没有任何关于如何配置和使用ACPI函数的线索。
我有一些基本的理解:
1,有一些ACPI表将被映射到内存空间,DSDT和SSDT将在其中提供一些定义块。
2、定义块为AML代码
3,我可以直接从ACPI表中检索一些信息(例如,I/O APIC基址)
4,更多信息有时需要运行ACPI对象。
这基本上就是我对ACPI的理解。但是,我应该如何使用AML代码,我应该如何运行ACPI对象。我一点也不知道。
那么,如果有人能够提供这种机制如何工作的基本结构,那么ACPI提供的一些基本功能如何通过操作系统实现呢?
非常感谢!我将继续阅读文档,并尝试找到一些可以帮助我理解它的东西。
发布于 2020-08-19 22:56:15
如果您正在使用linux,请尝试以下命令(以root身份),它将为您提供一个良好的开端(您应该安装与发行版相关的包,如acpica-tools):
$acpidump > dump.bin
$acpixtract -x dump.bin(这将为初始转储文件中的每个表创建一个二进制文件。大量的".dat“文件)
$iasl -d *dat(这将把二进制文件反汇编成人类可读的格式)
您也可以从github下载英特尔针对iasl编译器的实现(查找它。它非常容易编译)
发布于 2019-08-30 10:35:51
我的建议是:
a)如果你是初学者,实现对"PIC芯片“的支持,同时考虑到将来对IO APIC和MSI的支持,但还没有实现这种支持(例如,只实现虚拟存根等);然后考虑稍后添加对IO APIC(和MSI)和ACPI的支持(例如,在完成大部分操作系统之后,包括设备驱动程序、文件系统等)。请注意,这是我提倡“内核告诉设备驱动程序它应该使用哪些资源”方法(而不是“设备驱动程序告诉内核它想要哪些资源”方法)的主要原因-这样您就可以在以后添加对IO APIC和MSI的支持,而不需要接触任何设备驱动程序的任何代码。
b)对于ACPI的AML;这是一个令人讨厌的溃烂的混乱。具体地说,OS必须告诉AML是什么(例如,在AML中使用\_OS对象来告诉AML操作系统的名称),如果OS不能被计算机的AML所识别,那么AML会典型地退回到一个残缺的“最小功能”模式,并且许多计算机的AML只识别(各种版本)视窗。其结果是,要使用AML提供的全部功能,您的操作系统必须假装它是( Windows的一个版本),并且必须具有与该版本的Windows相同的行为,这没有很好的文档记录(例如,根本不包括在ACPI规范中),也不容易被“试错”技术发现。如果这还不够糟糕的话;各种计算机都有bugs,您需要“谁知道有多少”来解决这些bug。解决这个问题最实用的方法是依靠其他人编写的经过良好测试的代码。更具体地说,您可能想要移植ACPICA (参见https://acpica.org/ ),它是一个开放源码的、独立于操作系统的ACPI实现,它包括一个AML解释器,并隐藏/抽象了许多痛苦。
https://stackoverflow.com/questions/57719414
复制相似问题