ARM Linux Atags与设备树

设备树和ATAG之间有什么区别? 另外,ATAG是必须的,内核是否期望它们在一个固定的地址,还是期望它们在r0-r3?

设备树描述了内核用来选择加载哪些驱动程序的硬件的所有内容,所有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中找到的地址。 但是,ATAGs的使用现在已经被废弃和废弃,新的平台不应该使用它。

基本上ATAGs被用来向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. 

它使用bootloader使用相同的结构发送atag信息,所以它可以是后向字符兼容的。

希望能帮助到你。