uboot启动Linux内核过程分为4大步骤:
问题1:Flash的分区相关问题
在 上述步骤1/2/4 中都提到了从启动介质(iNand/SD)中读取uboot/kernel到SRAM/DDR中,那么具体从启动介质的什么位置分别读取呢?
上述步骤1中,iROM的code是SoC出厂内置的,因此这个位置要参考SoC的数据手册。摘抄数据手册如下:
-
SD/MMC/eSSD作为存储介质时,BL1在存储介质的Block1开始,长度为N. 每个block为512个bytes, 我们设置的BL1为16K,所以占用31个block,即block1 – block32用来存储BL1. (以下实例均以SD为例)
-
NAND作为存储介质时,BL1在存储介质的Page0开始,长度为N.
上述步骤2中,从存储介质(SD/Nand)中读取整个uboot到DDR中, BL2在存储介质中的地址是BL1(uboot前16k)中的code 定义的,所以和数据手册无关,我们根据需要自己实现即可。
比如,以SD为例,我们将整个uboot.bin烧录到SD卡的第49扇区开始的地方(block 48), 假如uboot大小为200K,则占用400个block, 所以uboot在SD的位置: block48 – block447.
上述步骤4中,从存储介质(SD/Nand)中读取整个kernel到DDR中,这个地址同步骤二,自己定义即可。
比如,以SD为例,我们将整个kernel烧录到SD卡的第601扇区开始的地方(block 600), 假如kernel大小为10240K,则占用20480个block, 所以uboot在SD的位置: block600 – block10839.
关于问题1,总结以下,存储介质(SD/Nand Flash)中的分区一般包含BL1,uboot, kernel, 其中BL1的位置和SoC的启动设计有关,需要参考数据手册,而uboot和kernel的所在的位置自己实现即可,我们一定要按照事先设计好的分区来烧写存储介质。
1) uboot必须在Flash开头(取决于SoC启动设计),其他分区相对位置是可变的。
2) 各分区的大小由系统移植工程师自己来定,一般定为合适大小(不能太小,太小了容易溢出;不能太大,太大了浪费空间)
3) 分区在系统移植前确定好,在uboot中和kernel中使用同一个分区表。将来在系统部署时和系统代码中的分区方法也必须一样。
遗留问题1:存储介质分区应该还包含roofs,即根文件系统,这个位置是怎么规划的?是怎么通知到内核的呢(传参(tag- ATAG_CMDLINE),用root=指定位置)?
遗留问题2:存储介质分区应该还包含环境变量。
2.1.uboot学习前传/ 2.1.12.uboot中对Flash和DDR的管理 有描述。