目录:
一、加载Linux(有无设备树)
二、设备树入门知识
一、加载Linux(有无设备树)
没有设备树的时候(以ARM架构为例):
- 内核在源码里记录了所有硬件相关的信息(芯片型号、内存大小,各种控制器和外设等);
- booloader只需要加载一个kernel image(例如uImage、zImage等),然后跳转到kernel image的起始地址就可以开始执行内核代码了。
- bootloader在加载kernel image前,会先准备好一些供内核使用的信息,这些信息被称为ATAGS,典型的ATAGS有:启动参数(command line)、内存大小、内存位置。bootloader在跳转到kernel image 前,会把ATAGS的地址放在r2寄存器里,内核启动时通过读r2寄存器获取ATAGS;因为ATAGS很重要(内存的起始地址和大小不确定的话内核寸步难行),内核必须尽早获取ATAGS。
- bootloader在加载kernel image前,会将单板型号(machine type,一个整型数)放在r1寄存器里,内核启动时获取到machine type integer,进而找到用于描述单板的struct machine_desc,struct machine_desc里包含了所有硬件信息:
- 以U-boot为例,U-boot加载内核的命令:bootm ,没有设备树时加载内核的示意图如下:
为什么要引入设备树?
引入设备树前:
- 所有单板相关的硬件信息都是hard-coded,这导致内核必须收集单板所有的配置,每当有一点点非常小的改动时,就需要生成一个新的kernel image。例如产品里某个I2C设备是可插拔的,那么不管这个I2C设备是否存在ÿ