首页 > uboot引导kernel - 1 - Flash的分区

uboot引导kernel - 1 - Flash的分区

uboot启动Linux内核过程分为4大步骤:

在这里插入图片描述

问题1:Flash的分区相关问题

上述步骤1/2/4 中都提到了从启动介质(iNand/SD)中读取uboot/kernel到SRAM/DDR中,那么具体从启动介质的什么位置分别读取呢?

上述步骤1中,iROM的code是SoC出厂内置的,因此这个位置要参考SoC的数据手册。摘抄数据手册如下:

  1. SD/MMC/eSSD作为存储介质时,BL1在存储介质的Block1开始,长度为N. 每个block为512个bytes, 我们设置的BL1为16K,所以占用31个block,即block1 – block32用来存储BL1. (以下实例均以SD为例)

    在这里插入图片描述

  2. 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的管理 有描述。

更多相关:

  • 选择你想要的数据库。 执行  exec sp_change_users_login 'UPDATE_ONE','用户名','登录名'   假如你的登录名是:sd exec sp_change_users_login 'UPDATE_ONE','sd','sd'   转载于:https://www.cnblogs.com/r...

  • 转载:http://blog.csdn.net/xinzheng_wang/article/details/7827775   Android 判断SD卡是否存在及容量查询的简单方法如下:首先要在AndroidManifest.xml中增加SD卡访问权限 [html] view plaincopy