设备树和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
我相信有(或者至少是)从固定位置而不是r2中找到的地址加载ATAG的选项。但是,现在不建议使用ATAG,并且已经过时了,不应使用新平台。