ARM Linux Atags与设备树

11 linux arm linux-kernel device-tree

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

tan*_*grs 14

设备树描述了内核用于选择要加载哪些驱动程序的硬件的所有内容,所有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
Run Code Online (Sandbox Code Playgroud)

我相信有(或至少是)从固定位置加载ATAG而不是在r2中找到的地址的选项.但是,ATAG的使用现在已经过时并且已经过时,新平台不应该使用它.


小智 6

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

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

有一些想法可以使用新的atag"atag_dtd"将设备树信息发送到内核,但后来有人争论不使用ATAG,因为没有必要使用两个seprate方法来做一件事.所以现在内核期望引导加载程序提供以下信息.

r0 = 0
r1 = Same type of SOC fdt machine id.
r2 = physical address where the dtd can be found.
Run Code Online (Sandbox Code Playgroud)

它使用引导加载程序用来发送atag信息的相同结构,因此它可以是后向兼容的.

希望能帮助到你.