u-boot中分区和内核MTD分区关系
一、u-boot中环境变量与uImage中MTD的分区关系
分区只是内核的概念,就是说A~B地址放内核,C~D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等。
一般我们只需要分3-4个区,第一个为boot区,一个为boot参数区(传递给内核的参数),一个为内核区,一个为文件系统区。(但是有的内核就会有很多分区,比如内核参数会有两个,还有会Logo的地址)
而对于bootloader中只要能将内核下载到A~B区的A地址开始处就可以,C~D区的C起始地址下载文件系统…….这些起始地址在MTD的分区信息中能找到。所以bootloader对分区的概念不重要,只要它能把内核烧到A位置,把文件系统烧到C位置即可。
所以,在bootloader对Flash进行操作时,哪块区域放什么是以内核为主(内核中MTD的分区信息可以从内核的代码中看到)。传递给u-boot的参数只要和内核中MTD分区信息一致即可。
而为了方便操作,bootloader类似也引入分区的概念。例如,可以使用“nandwrite 0x3000000 kernel 200000”命令将uImage烧到kernel分区,而不必写那么长:nand write 3000000 A 200000,也就是用分区名来代替具体的地址。
这要对bootloader对内核重新分区:这需要重新设置一下bootloader环境参数,就可以同步更新内核分区信息
如:
setenv bootargs 'noinitrd console=ttySAC0root=/dev/mtdblock3 rootfstype=jffs2 mtdparts=nand_flash:128k(u-boot)ro,64k(u-bootenvs),3m(kernel),30m(root.jffs2),30m(root.yaffs)'
解析:在这里的挂载文件系统的地方mtdblock3,可以从mtdparts中看出来,第一个文件系统(jffs2格式)在第四个分区,所以使用mtdblock3,关于分区和文件系统的挂载在下面有解释。
在设置了mtdparts变量之后,就可以在nand read/write/erase命令中直接使用分区的名字而不必指定分区的偏移位置.而这需要内核MTD最好没有规划分区。
如果你是通过uboot的内核命令行给MTD层传递MTD分区信息,这种情况下,内核读取到的分区信息始终和u-boot中的保持一致(推荐的做法)
如果你是把分区信息写在内核源代码MTD里定义好的方法,那最好保证它和u-boot中的保持一致,即同步修改uboot及内核的相关部分。
解析:从分析的内容可以看出来,首先使用bootargs是可以重新设置内核分区的,使用的mtdparts,也就是说,如果内核中没有指定好mtd分区信息的话,使用uboot给与分区是很好的办法,如果内核中指定好了分区的信息,最好保证uboot中的分区和内核中的分区一直,如果不一致的话,自我感觉是使用uboot的分区信息,或者是uimage启动不成功。
Uboot中分区和内核MTD分区之间的关系理解:
首先觉得这两者是有关系的,但是关于在NAND分区过程中,是哪个依附于哪个,我觉得是uboot依附MTD,在内核flash device驱动中,如果有声明NAND分区信息的话,在uboot中可以再进行mtdparts分区,但是最终的结果是依照MTD进行挂载文件系统的,例如:
如果内核分区信息如下:
staticstruct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "uboot",
.offset = 0x00000000,
.size = 0x00040000,
},
[1] = {
.name = "kernel",
.offset = 0x00200000,
.size = 0x00300000,
},
[2] = {
.name = "yaffs2",
.offset = 0x00500000,
.size = MTDPART_SIZ_FULL
}
};
从中可以发现,uboot和kernel是存在间隙的,但是不管怎么说,在NAND的最低端可定是uboot的信息,那么这个开发板的uboot的分区信息如下:
bootargs=noinitrdroot=/dev/mtdblock2 init=/linuxrc console=ttySAC0
mtdparts=mtdparts=nandflash0:256k@0(bios),128k(params),128k(toc),512k(eboot),1024k(logo),3m(kernel),-(root)
从上面便可以看出来,挂载文件系统的块并不是按照mtdparts中顺序数出来的文件系统块,因为在内核代码中,文件系统是挂载在mtdblock2上,但是在uboot分区中不是这个样子,如果按照uboot的话应该是mtdblock5,但是内核中uboot和kernel之间是有间隙的,这个间隙正好别kernel之前的东西填充结束,总共2m,从内核信息中的mtd分区信息可知,在kernel声明中,偏移量offset=0x200000,也就是2m,但是uboot的大小是size=0x40000,也就是256K,
这两者中间是有间隙的,间隙的部分正好被填充满,但是挂载文件系统依旧是依照内核信息而不是依照uboot中的分区。
但是也有人说,修改nand分区,直接修改uboot中的mtdparts就可以,也就是说,
1.如何对nand 分区。修改mtdparts环境变量就可以了么?
对于目前的U-boot而言,是的.而且, 设置了mtdparts变量之后,你可以在nand read/write/erase命令中直接使用分区的名字而不必指定分区的偏移位置.
set 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)
2 内核通过bootargs找到文件系统,bootargs中的mtdblockx即代表分区,block1,2,3代表哪个分区是如何确定的。
事实上,bootargs中的"root=/dev/mtdblockx"只是告诉内核,root fs从第x个(x=0,1,2...)MTD分 区挂载,mtdblock0对应第一个分区,mtdblock1对应第二个分区,以此类推.至于这个分区对应MTD device(NAND Flash)的哪一段范围,取决于内核读到的MTD分区信息,这个分区信息可以通过:
1) 写死在MTD层的NAND Controller驱动或者内核其他部分代码里
2) 通过U-boot传递给内核的命令行中的mtdparts=...部分解析得出,解析的规则同u-boot中mtdparts变量的赋值规则
3) 其他可以让内核知道分区信息的任何办法
3 在u-boot中给nand分区后是否要对应修改kernel的代码?
如果你用的是通过内核命令行给MTD层传递u-boot中的MTD分区信息,那是不需要的,在这种情况下,内核读取到的分区信息始终和u-boot中的保持一致(推荐的做法)
如果你用的是把分区信息写死在内核源代码里的方法,那最好保证它和u-boot中的保持一致,即同步修改内核的相关部分代码
从上面这几个情况看出来,如果在uboot中进行nand分区,那么尽量保证和内核一致,如果内核中没有声明分区信息的话,在uboot中的分区就可以当做分区信息使用。从第二个问题的回答可以看出来,那么挂载文件系统的部分还是依靠内核的mtd分区的。
nand write0x3000000 kernel 200000 这条命令是说从内存中往flash中写内核,从内存地址为0x30000000的地方开始写,往flash的偏移地址为200000的地方写kernel这么多字节,也可以这么理解:从内存位置为0x30000000的地方读取kernel这么大的字节全部写到flash偏移地址为200000的地方
nand read.jffs2 0x30007FC0 kernel;
从nand读出内核:从哪里读? 从kernel分区
放到哪里去?-0x30007FC0
二、常用的分区方法
u bootcmd
u-boot中分区和内核MTD分区关系的更多相关文章
- uboot环境变量与内核MTD分区关系
uboot 与系统内核中MTD分区的关系: 分区只是内核的概念,就是说A-B地址放内核,C-D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等. 1:在内核MTD中可以定义分区A~B, ...
- linux内核 mtd分区
首先 内核配置需要打开MTD选项 Memory Technology Devices (MTD) ---> 如果是NOR Flash,需要选择Common Flash Interface (CF ...
- 关于NAND flash的MTD分区与uboot中分区的理解
关于NAND flash的MTD分区与uboot中分区的理解 转自:http://blog.csdn.net/yjp19871013/article/details/6933455?=40085044 ...
- 第3阶段——内核启动分析之prepare_namespace()如何挂载根文件系统和mtd分区介绍(6)
内核启动并初始化后,最终目的是像Windows一样能启动应用程序,在windows中每个应用程序都存在C盘.D盘等,而linux中每个应用程序是存放在根文件系统里面,那么挂载根文件系统在哪里,怎么实现 ...
- 通过uboot传参设置mtd分区流程源码分析
因为公司同事反映他使用的开板无法将根目录下的ip_work目mounth成功,由于本人当时没有去现场查看问题,只是象征性的询问内核是否创建了/dev/mtdblock5设备节点,因为该开发板默认是挂载 ...
- NO10 查看Linux操作系统-版本-内核-Linux分区
·看Linux系统: [root@localhost ~]# uname -m (看操作系统)x86_64[root@localhost ~]# uname -a (看操作系统)Linux lo ...
- UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究
内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...
- 如何在Virtualbox中对Ubuntu系统根分区扩容
转载: 参见博客: https://blog.csdn.net/LEON1741/article/details/56494797 前在Virtualbox中安装了一个Ubun ...
- 详解Oracle数据货场中三种优化:分区、维度和物化视图
转 xiewmang 新浪博客 本文主要介绍了Oracle数据货场中的三种优化:对分区的优化.维度优化和物化视图的优化,并给出了详细的优化代码,希望对您有所帮助. 我们在做数据库的项目时,对数据货场的 ...
随机推荐
- HTML+CSS基础学习笔记(6)
一.元素分类 CSS中html的标签元素大体分为三种类型 1.块状元素 @特点: #每个块级元素都从新的一行开始,并且其后的元素也另起一行(一个块级元素独占一行) #元素的高度.宽度.行高以及顶和底边 ...
- [转]JavaScript 的同源策略
同源策略限制了一个源(origin)中加载文本或脚本与来自其它源(origin)中资源的交互方式. 同源定义 如果两个页面拥有相同的协议(protocol),端口(如果指定),和主机,那么这两个页面就 ...
- WPF Radio组的绑定
都是控件编,RadioButtion 简单绑定使用,model.cs下边定义属性 private int _isSuccess; public int IsSuccess { get { return ...
- “jni.h”: No such file or directory
VS2010解决方案: 进入 “包含目录“ 方式: 右键项目属性页-> 配置属性->VC++目录->包含目录 在”包含目录“中编辑 添加以下路径: C:\Program Files\ ...
- hibernate逆向工程生成的实体映射需要修改
根据实际情况进行修改,主要2处,注释的位置<!-- 把catalog="platform"删掉 -->,<!-- 替换为native --> <? ...
- Oracle学习【语句查询】
基本查询语句any和all不能单独使用,必须和比较符一起使用>any 大于最小的例如:select * from emp where sal >any(1000,2000);<any ...
- iOS 身份证最后一位是X,输入17位后自动补全X(转)
非原创,转载自http://blog.csdn.net/l2i2j2/article/details/51542028如果身份证最后一位是X,输入17位后自动补全X// textField代理方法 - ...
- javascript 浏览器执行断点
在javascript代码里面有个语句可以让浏览器执行到这里的时候触发断点,这个命令就是 debugger 很好用
- 读书笔记之 - javascript 设计模式 - 装饰者模式
本章讨论的是一种为对象增添特性的技术,它并不使用创建新子类这种手段. 装饰者模式可以透明地把对象包装在具有同样接口的另一对象之中,这样一来,你可以给一些方法添加一些行为,然后将方法调用传递给原始对象. ...
- JavaScript学习总结【2】、JS基础
1.JS 命名规范 命名规范是很有必要的,可增强代码的可读性,一眼就能看懂要表达的意思,规范就是符合规则,使代码有利于后期维护,也能很大程度的提高开发效率.一个正常的网站有很多 JS 代码,如果在编写 ...