uboot 与系统内核中 MTD分区的关系:
分区只是内核的概念,就是说A~B地址放内核,C~D地址放文件系统,等等。
1:在内核MTD中可以定义分区A~B,C~D。。。。。。并且以绝对的地址赋上值。
bootloader中只要能将内核下载到A~B区的A地址开始处就可以,C~D区的C起始地址下载文件系统。。。这些起始地址在MTD的分区信息中能找到。
bootloader对分区的概念不重要,只要它能把内核烧到A位置,把文件系统烧到C位置。
所以,在bootloader对Flash进行操作时,哪块区域放什么是以内核为主。
而为了方便操作,bootloader类似也引入分区的概念,如,可以使用“nand write 3000000 kernel”命令将uImage烧到kernel分区,而不必写那么长:nand write 3000000 A ……
这要对bootloader对内核重新分区:这需要重新设置一下bootloader环境参数,就可以同步更新内核分区信息
如:
setenv bootargs 'noinitrd console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2
mtdparts=nand_flash:128k(u-boot)ro,64k(u-boot envs),3m(kernel),30m(root.jffs2),30m(root.yaffs)'
内核配置时选上Device Drivers ---> Memory Technology Device (MTD) support ---> Command line partition table parsing
在设置了mtdparts变量之后,就可以在nand read/write/erase命令中直接使用分区的名字而不必指定分区的偏移位置.而这需要内核MTD最好没有规划分区。
a 。如果你是通过uboot的内核命令行给MTD层传递MTD分区信息,这种情况下,内核读取到的分区信息始终和u-boot中的保持一致(推荐的做法)
b 。如果你是把分区信息写在内核源代码MTD里定义好的方法,那最好保证它和u-boot中的保持一致,即同步修改uboot及内核的相关部分。
2:
内核通过bootargs找到文件系统,bootargs中的mtdblockx即代表分区,block1,2,3代表哪个分区。
事实上,bootargs中的"root=/dev/mtdblockx"只是告诉内核,root fs从第x个(x=0,1,2...)MTD分区挂载,mtdblock0对应第一个分区,mtdblock1对应第二个分区,以此类推.
3:分区方法
1) MTD层的分区
2) 通过U-boot传递给内核的命令行中的mtdparts=...
3) 其他可以让内核知道分区信息的任何办法,(内核默认的命令参数)