以下内容源于朱有鹏嵌入式课程的学习与整理,

1、uboot阶段对Flash的分区

所谓分区,即对存储设备进行分块管理。

PC机等产品中,整个硬盘由操作系统统一管理,其使用文件系统帮我们管理硬盘空间,从而管理保证了文件之间不会互相堆叠,使用者不用太过在意分区问题。

uboot中没有操作系统,因此必须事先规定Flash(相当于硬盘)的分区表。实际上在uboot中和kernel中都有一个分区表(uboot中有这个分区表我知道,kernel中的这个分区表在哪里),对Flash进行管理与分配。注意,uboot和kernel必须使用相同的分区表,烧录镜像到Flash时也必须遵守这个分区表。。

Flash的分区方法是可以变动的,但在移植中必须事先定好写死,其标准如下。

  • uboot必须从Flash的起始地址开始存放,位置取决于SoC的启动设计。
  • uboot分区的大小必须保证uboot肯定能放下,一般设计为512KB或者1MB,因为一般的uboot大小不足512KB。
  • 环境变量分区一般紧贴着uboot分区,大小为32KB或者更多一点。
  • kernel分区可以紧贴环境变量分区存放,大小一般为3MB或5MB或其他。
  • rootfs分区一般也紧贴着kernel分区存放的。
  • 剩下的就是自由分区,一般kernel启动后将自由分区挂载到rootfs下使用。

也就是说,Flash中各分区彼此相连,前面一个分区的结尾就是后一个分区的开头。除了uboot必须在Flash开头,其他分区相对位置是可变的。另外各分区的大小由系统移植工程师来定,太小了容易溢出,太大了浪费空间。

2、uboot阶段对DDR的分配

内存的内容是掉电消失的,因此可以说DDR是每次系统运行时才开始部署使用的。

内存的分配,关键在于明确内存中某块空间的作用,以避免各个不同功能使用了同一块内存造成的互相踩踏。我们使用指令“tftp 0x23E00000 zImage”将zImage下载到内存的0x23E00000处就会出现错误,因为这个内存处实际是uboot的镜像所在,这样下载会将内存中的uboot给覆盖掉。

内存的分配使用主要是在linux内核启动起来之前,linux内核启动后内核的内存管理模块会接管整个内存空间,那时候就不用我们来管了。