1、boot img中各种img分布及各img加载到内存地址
bootimg | img szie | Mem Addr |
boot header | bootloader sz (2048B) | 读取到指定的数组结构中 |
kernel | kernel sz | 0x80008000 |
Ramdisk | Ramdisk sz | 0x85500000 |
Device Tree | DT imgsz | 0x85400000 |
上图数据以SPRD SC7731平台为例 ,注意XXX sz需要kernelpage size对齐。
2、uboot中对与DT img的相关处理
在uboot阶段首先会从bootimg所在的分区中读取DTS的 img文件,然后对读取的到数据进行判断;首先判断头部数据是否符合设定,再进行platfom_id, hardware_id, soc_revision 进行判断,如果与设定一致则认为此DTS(blod)结构与系统匹配,则经被拷贝到DT_addr 指向的内存空间,在启动内核的此地址作为参数被传入到kernel。
根据的上述的platform_id … 等匹配过程可知,在一个dts img文件中可以兼容多个不同系统配置的dts , 在uboot阶段可以将dts中platform_id与设定的platform_id 比较来决定适应哪组 dts文件。
DTS在uboot阶段还有一些重要的数据组合、追加。如 calibrate data、Dram param、device info、boot mode 、boot cmd ...
u-boot启动kernel函数如下:
theKernel(0, machine_type, fdt_blob); //theKernel为指向0x80008000 的地址函数
// 0 -----> R0、
// machine_type-----> R1 、
// DT_addr-----> R3 .