13

设备树和 ATAG 有什么区别?此外,ATAG 是必须的吗?内核是否期望它们位于固定地址,还是期望它们位于 r0-r3 中?

4

2 回答 2

16

设备树描述了内核用来选择要加载哪些驱动程序的硬件的所有内容,所有 MMIO 接口在哪里,等等......在运行时。ATAG 仅描述了诸如在哪里可以找到 initrd 和内核参数、内存等的内容——关于机器的所有其他内容都被硬编码到内核中。

现在首选的方法是使用设备树而不是 ATAG。优点之一包括添加新平台并不总是需要向内核添加新代码。

要回答您的第二个问题,如果您已阅读在ARM 平台上启动 Linux的文档,您会发现内核希望在将控制权移交给内核之前将以下内容放入寄存器中:

r0 = 0,
r1 = machine type number discovered in (3) above.
r2 = physical address of tagged list in system RAM, or
     physical address of device tree block (dtb) in system RAM

我相信有(或至少有)一个选项可以从固定位置加载 ATAG,而不是从 r2 中找到的地址。但是,ATAG 的使用现在已被弃用和过时,新平台不应使用它。

于 2014-01-09T14:12:34.610 回答
6

基本上,ATAG 用于向 linux 内核发送有关板的机器特定信息的信息,如内存、控制台信息等,这些 ATAG 被 linux 内核用于初始化 MMU 和其他子系统。

但是随着设备树的出现(更多地与 arm 一起使用它,因为它已经在 powerpc 架构中使用。)现在所有与机器相关的信息都可以使用 FDT(设备树 blob)传递。

有一些想法可以使用新的 atag“atag_dtd”将设备树信息发送到内核,但后来出现了根本不使用 ATAG 的争论,因为不需要使用两种单独的方法来做一件事情。所以现在内核期望引导加载程序提供以下信息。

r0 = 0
r1 = Same type of SOC fdt machine id.
r2 = physical address where the dtd can be found.

它使用与引导加载程序相同的结构来发送 atag 信息,因此它可以与 backword 兼容。

希望能帮助到你。

于 2016-03-21T08:34:13.413 回答