所谓分区,就是说对Flash进行分块管理。//如何方便地进行分块管理(存储设备类型和数量);
对Flash(相当于硬盘)的管理必须事先使用分区界定;
uboot中和kernel中都有个分区表,分区表就是我们在做系统移植时对Flash的整体管理分配方法。
有了这个界定后,我们在部署系统时按照分区界定方法来部署,uboot和kernel的软件中也是按照这个分区界定来工作,就不会错。
分区方法不是一定的,不是固定的,是可以变动的。
uboot必须从Flash起始地址开始存放(uboot分区的大小必须保证uboot肯定能放下,一般设计为512KB或者1MB(因为一般uboot肯定不足512KB,给再大其实也可以工作,但是浪费)
kernel:内核
rootfs:根文件系统
剩下的就是自由分区,一般kernel启动后将自由分区挂载到rootfs下使用
uboot必须在Flash开头,其他分区相对位置是可变的。
各分区的大小由系统移植工程师自己来定,一般定为合适大小(不能太小,太小了容易溢出;不能太大,太大了浪费空间)
分区在系统移植前确定好,在uboot中和kernel中使用同一个分区表。将来在系统部署时和系统代码中的分区方法也必须一样。
我们烧写程序时,实际是将程序先烧写到了内存当中,然后由内存搬运到NAND flash中
init=/linuxrc init进程的位置。
console=ttySAC0 终端对应tty设备,因此,在引导系统前,串口驱动移植应当完成。
其实uboot的分区表就是个助记符一样,甚至很多uboot压根就没有分区表,
而内核就一定要有一张分区表,内核根据他们的位移来确定存储区的范围,
读取分析在上面的结构,文件系统之类。
uboot一般可以将分区表传入内核,通过bootargs参数,这样内核启动后就可以知道分区信息了。
找到uboot中对应你工程的源文件,里面应该有分区表,或者你直接搜分区表的名字~
内核通过bootargs找到文件系统
bootargs中的mtdblockx即代表分区,block1,2,3代表哪个分区
bootargs中的"root=/dev/mtdblockx"只是告诉内核,root fs从第x个(x=0,1,2...)MTD分区挂载
mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)
要想这个参数起作用,内核中的mtd驱动必须要支持,即内核配置时需要选上。
分区方法:
1) MTD层的分区
2) 通过U-boot传递给内核的命令行中的mtdparts=...
3) 其他可以让内核知道分区信息的任何办法,(内核默认的命令参数)
如果你是通过uboot的内核命令行给MTD层传递MTD分区信息,这种情况下,内核读取到的分区信息始终和u-boot中的保持一致(推荐的做法)
如果你是把分区信息写在内核源代码MTD里定义好的方法,那最好保证它和u-boot中的保持一致,即同步修改uboot及内核的相关部分。