DTS和ACPI的区别

18

我们可以在dts文件中声明平台设备信息,而不是将每个数据硬编码到操作系统中。以"arm"架构为例。它支持dts,我们将从arch/arm/boot/dts/xx.dts获取dts。将此xx.dts转换为xx.dtb,并与内核映像一起加载。最近我遇到了ACPI,当我遇到x86架构时,从文档中我了解到ACPI类似于设备树。我们可以在ACPI表中声明平台设备信息,我的疑问是这些ACPI表究竟在哪里。我该如何将此信息加载到Linux中。使用ACPI的优点是什么,相对于dts呢。如果我有错,请纠正我。提前致谢


2
ACPI表位于固件中。特别是您感兴趣的是DSDT表。您还可以覆盖它们(请参见https://dev59.com/aVwY5IYBdhLWcg3w0KnL)。 - 0andriy
感谢Andy的评论,我想在编译Linux时添加基于Intel Atom x86的板卡平台设备信息,在Linux中应该在哪里添加这些信息呢?类似于ARM,在arch/arm/boot/xx.dts中添加。 - anikhan
在ARM上,你不能只是把某些东西放在xx.dts中,你需要告诉固件加载编译好的dtb文件,并将指针传递给已加载的内核。在x86上,内核从由固件提供的ACPI表中获取所有平台信息(通常称为x86 BIOS)。你不能在那里放置任意平台信息。如果有任何遗漏,这意味着你的BIOS不够好——它可能无法检测到可插拔设备,或者无法提供有关平台硬连/焊接部分的信息。修复固件,而不是Linux。 - Alexander Amelkin
首先,不要忘记在评论中添加被评论人的昵称(以 @ 开头),否则可能会引起误解。 - 0andriy
4个回答

10

不完全正确:

  • ACPI最初是固件(以前的BIOS)和操作系统之间的接口,用于诸如电源管理之类的事情,但也包括平台设备探测等。
  • DT始终(甚至在ACPI存在很久之前)都是关于声明性平台设备描述(探测和配置),因此操作系统可以正确初始化所有驱动程序,配置操作点等等。

ACPI的范围非常有限,取决于固件,而DT可以独立运行(只需要引导加载程序将正确的dtb传递给内核)。

ACPI是BIOS和主板供应商为解决DT早已解决的一小部分问题而做出的不专业、hackish尝试。对于那些行将就木的人来说,ACPI / BIOS的一个主要优点可能是它隐藏了很多低级配置内容(直到运行时设备编程,例如用于功率管理),从而阻止操作系统内核完全控制机器。(这最终导致像坏的BIOS造成的机器故障等问题)。我们,内核开发者,常常不得不解决差劣的BIOS所带来的问题。

我的强烈建议:如果有可能,请摆脱ACPI。


2
看这个:https://events.static.linuxfound.org/sites/events/files/slides/unified_properties_API_0.pdf - 0andriy

6

是使用肺还是鳃呼吸?这取决于你生活的地方。

建筑物的一个粗略分类是

x86 - Server/PC - ACPI table 
ARM - embedded systems - Device Tree

在服务器/PC主板上,ACPI表是UEFI固件的一部分,位于闪存芯片上。操作系统稍后会被安装在其他地方(硬盘或其他位置)。操作系统解析ACPI表,但操作系统开发人员无法控制固件中已经编写的内容;他们甚至不知道主板的内部设计。主板供应商(固件提供者)需要支持任何要安装的操作系统,而不仅仅是Linux,因此他们必须遵循标准(UEFI),而不是专注于Linux特定的东西,例如设备树。
在嵌入式系统中,操作系统和其他所有内容都由供应商一次性编程,用户不再进行编程。操作系统是固件的一部分。因此,不需要担心操作系统支持矩阵,只需在板子和操作系统映像之间建立1对1的关系。U-Boot、内核、initramfs、设备树blob都存储在同一个闪存存储器(即NAND)中。因此,开发人员可以访问并控制要部署为设备树的内容(必须与实际硬件匹配)。
硬件设计师应该能够提供ACPI表和设备树。根据接收方不同,将优先使用其中之一。
参考资料:

4

在我看来

ACPI和DT用于类似的目的,但它们具有各自独特的功能。现在的趋势是在DT中定义ACPI配置。

ACPI和DT用于解决不同的问题:

  1. ACPI旨在提高功率效率。
  2. DT的目的是将平台文件移出内核。

设备树大多在Linux内核启动之前传递给内核。ACPI通常在Linux内核引导时加载(有关更多信息,请查看Documentation/acpi/enumeration.txt)。

如有其他问题,请留言。


请查看链接中的幻灯片12,了解有关统一属性API的更多信息。 - 0andriy

2

ACPI和DT在不同的架构中使用。

  1. ACPI用于英特尔架构,例如:x86架构
  2. DT用于ARM架构

您可以在Linux内核源代码中手动区分它们。

  1. ACPI使用.acpi_match_table{...}
  2. ARCH使用.of_match_table{...}

参考资料:

  1. ACPI vs DT: https://blog.linuxplumbersconf.org/2013/ocw/proposals/1173

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接