Part1:uboot阶段Flash的分区
1.1 分区
分区: 对Flash
进行分块管理。
PC机等产品中,都是在操作系统下使用硬盘,整个硬盘由操作系统统一管理。
操作系统会使用文件系统帮我们管理硬盘空间。
管理保证了文件之间不会互相堆叠,于是乎使用者不用自己太过在意分区问题。
在uboot
中是没有操作系统的,因此我们对Flash
(相当于硬盘)的管理必须事先使用分区界定。
实际上在
uboot
中和kernel
中都有个分区表,分区表就是我们在做系统移植时对Flash
的整体管理分配方法
有了这个界定后,我们在部署系统时按照分区界定方法来部署,uboot
和kernel
的软件中也是按照这个分区界定来工作,就不会错。
1.2 分区方法
分区方法不是一定的,不是固定的,是可以变动的。
但是在一个移植中必须事先设计好定死,一般在设计系统移植时就会定好。
定的标准是:
-
uboot:
uboot
必须从Flash
起始地址开始存放也许是扇区0,也许是扇区1,也许是其他,取决于SoC的启动设计
uboot
分区的大小必须保证uboot
肯定能放下,一般设计为512KB
或者1MB
因为一般uboot肯定不足512KB,给再大其实也可以工作,但是浪费
-
环境变量:
环境变量分区一般紧贴着
uboot
来存放,大小为32KB
或者更多一点。 -
kernel:
kernel
可以紧贴环境变量存放,大小一般为3MB
或5MB
或其他。 -
rootfs:
…
-
自由分区:
剩下的就是自由分区,一般
kernel
启动后将自由分区挂载到rootfs
下使用。
1.3 总结
一般规律如下:
-
各分区彼此相连,前面一个分区的结尾就是后一个分区的开头。
-
整个flash充分利用,从开头到结尾。
-
uboot
必须在Flash
开头,其他分区相对位置是可变的。 -
各分区的大小由系统移植工程师自己来定,一般定为合适大小
不能太小,太小了容易溢出;不能太大,太大了浪费空间
-
分区在系统移植前确定好,在
uboot
中和kernel
中使用同一个分区表,将来在系统部署时和系统代码中的分区方法也必须一样。
Part2:uboot阶段DDR的分区
-
DDR
的分区和Flash
的分区不同,主要是因为Flash
是掉电存在的,而DDR
是掉电消失,因此可以说DDR
是每次系统运行时才开始部署使用的。 -
内存的分区主要是在
Linux
内核启动起来之前,Linux
内核启动后内核的内存管理模块会接管整个内存空间,那时候就不用我们来管了。 -
注意内存分区关键就在于内存中哪一块用来干什么必须分配好,以避免各个不同功能使用了同一块内存造成的互相踩踏。
譬如:
tftp 0x23E00000 zImage
去下载zImage
到内存的0x23E00000
处就会出错,因为这个内存处实际是uboot
的镜像所在。这样下载会导致下载的zImage
把内存中的uboot
给冲掉。