【问题标题】:How can I compile, run AML with ACPI, or how should I utilize ACPI functions?如何使用 ACPI 编译、运行 AML,或者我应该如何使用 ACPI 函数?
【发布时间】:2020-01-03 06:36:59
【问题描述】:

我正在尝试编写内核并计划在某些问题上使用 ACPI(例如识别 APIC 上的中断源)。

但是,我确实是这方面的初学者,我阅读了相关文档,但仍然没有任何关于如何配置和使用 ACPI 功能的线索。

我有一些基本的了解:

1、内存空间中会映射一些ACPI表,其中DSDT和SSDT会提供一些定义块。

2、定义块为反洗钱代码

3,我可以直接从 ACPI 表中检索一些信息(例如 I/O APIC 基地址)

4,更多信息有时需要运行 ACPI 对象。

这些基本上是我对 ACPI 的理解。但是,我应该如何使用 AML 代码,我应该如何运行 ACPI 对象。我不知道。

那么如果有人能提供这个机制如何工作的基本结构,那么ACPI提供的一些基本功能如何被OS实现??

非常感谢!我会继续阅读文档并尝试找到一些可以帮助我理解它的东西。

【问题讨论】:

    标签: operating-system acpi


    【解决方案1】:

    我的建议是:

    a) 如果您是初学者,请实现对“PIC 芯片”的支持,同时考虑未来对 IO APIC 和 MSI 等事物的支持,但尚未实现该支持(例如,只是虚拟存根等);然后担心稍后添加对 IO APIC(和 MSI)和 ACPI 的支持(例如,在完成大部分操作系统之后,包括设备驱动程序、文件系统等)。请注意,这是为什么我提倡“内核告诉设备驱动程序它应该使用哪些资源”方法(而不是“设备驱动程序告诉内核它想要哪些资源”方法)的一个重要部分——因此您可以添加对 IO APIC 的支持和 MSI 之后,无需触及任何设备驱动程序的任何代码。

    b) 对于 ACPI 的 AML;这是一个令人讨厌的溃烂烂摊子。具体来说,操作系统必须告诉 AML 操作系统是什么(例如,使用 AML 中的\_OS 对象来告诉 AML 操作系统的名称),如果计算机的 AML 无法识别操作系统,那么 AML 通常会退回到残缺的“最低限度功能”模式,许多计算机的 AML 只能识别(各种版本的)Windows。结果是,要使用 AML 提供的全部功能,您的操作系统必须假装它是(一个版本的)Windows,并且必须具有与该版本的 Windows 相同的行为,这没有很好的文档记录(例如,未包含在ACPI 规范)并且不容易通过“反复试验”技术发现。如果这还不够糟糕;各种计算机都有错误的 AML,您需要“谁知道有多少”解决这些错误的方法。解决此问题的最实用方法是依靠其他人编写的经过良好测试的代码。进一步来说;您可能想要移植 ACPICA(请参阅 https://acpica.org/ ),它是 ACPI 的开源和独立于操作系统的实现,包括一个 AML 解释器并隐藏/抽象了很多痛苦。

    【讨论】:

    • 使用 ACPICA 并不能消除固件中准备不当的表格的怪癖的必要性。
    【解决方案2】:

    如果您使用的是 linux,请尝试以下操作(以 root 身份),它会给您一个良好的开始(您应该安装发行版相关的软件包,例如 acpica-tools):

    $acpidump > dump.bin
    
    $acpixtract -x dump.bin
    

    (这将为初始转储文件中的每个表创建一个二进制文件。很多“.dat”文件)

    $iasl -d *dat
    

    (这会将二进制文件反汇编为人类可读的格式)

    你也可以从 github 下载 intel 的 iasl 编译器实现(查一下,很容易编译)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-22
      • 2011-05-17
      • 2014-10-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      相关资源
      最近更新 更多