kernel mtd 分区与UBOOT 分区的理解
static struct 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分区中存在间隙,心中产生了疑问,难道MTD分区的时候要有注意的问题?通过各方查找资料和查阅书籍,找到了原因。不对的地方还请大家指正。
首先说一下Linux下固态存储设备(NAND flash算其中一种)对系统组件的安排方式,一般为
引导加载程序 |
引导参数 |
内核 |
根文件系统 |
也就是说,在NAND flash中,各部分的程序是这样安排的,但哪一端是高地址是依体系结构不同而不同的,对于ARM,引导加载程序在最低地址处,因此,无论是uboot的分区还是内核MTD分区,引导加载程序的分区都放在了最低地址处。那么,两个分区到底怎么联系起来,而我们又该怎么设置MTD分区呢?先给出我的开发板uboot的分区信息:
bootargs=noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
mtdparts=mtdparts=nandflash0:256k@0(bios),128k(params),128k(toc),512k(eboot),1024k(logo),3m(kernel),-(root)
然后说一下MTD分区,这个分区是内核可以识别的分区,也就是说,内核的操作都是基于MTD分区的;而uboot的分区只是为了方便操作,例如,我想将内存中0x30000000地址处的内容写到NAND flash的偏移量为2M的地址处,即uboot分区中kernel的起始位置,一般情况,我们要写
nand write 0x30000000 0x00200000
但如果有了uboot的分区,我们可以写
nand write 0x30000000 kernel
说清上面的问题,为了进一步阐述后面的问题,这里再讲一下我对uboot引导过程的理解,当系统启动后,uboot开始执行,他分两个阶段完成工作,主要是一些初始化,然后,加载内核并传递内核参数,之后跳入内核执行,内核完成它的初始化工作,其中包括挂载文件系统。
现在,我们可以翻回头看上面程序中的MTD分区了。MTD分区中的uboot分区明显对应了uboot分区中的bios分区(从0开始,大小为128K),而MTD分区中的kernel和yaffs2分区的起始地址和大小也分别对应uboot分区中的kernel和root分区。而因为我们不需要uboot分区中的其他部分,所以在MTD分区中出现了这一部分空隙。但为什么这么安排呢?
回想我们在烧写程序时候的操作,比如我们选择烧写内核镜像,此时,uboot实际执行了一条语句,类似于
#define kernel 0x00200000
memcpy(kernel,0x30000000,SZ_3M)
这里我们烧写程序的入口地址是0x30000000,也就是说,uboot的下载模式将我们烧写到内存0x30000000处的数据,搬到了NAND flash的kernel处,保存了起来,因此,这里要清楚,我们烧写程序时,实际是将程序先烧写到了内存当中,然后由内存搬运到NAND flash中,如果此时我们的MTD分区与uboot中的分区是一致的,那么内核将来运行时可以很方便的找到内核程序所在的位置,同样,对文件系统的yaffs2分区也是如此,而且,与内核分区相比,文件系统的分区将显得更加重要,因为将直接影响到根文件系统能否挂载,这里是因为上面提到的一行
bootargs=noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
这里,uboot指定了根文件系统的代码来自于mtdblock2,也就是MTD分区的第三个分区(第一个编号为0),也就是我上面说到的,uboot完成初始化后,加载内核,而内核要完成文件系统的挂载,他从哪里找文件系统?就是这里!/dev/mtdblock2!
所以,现在我们看到,MTD分区的原因,而且最关键的在这里,其他分区如果与uboot的分区不一致还情有可原,但如果MTD分区中文件系统的分区与uboot中的root分区不一致,将会直接导致系统无法启动!
当然,之前操作的都是物理地址,当内核真正运行起来以后,将开始使用虚拟地址。
同样的,其他几个引导参数也应该得到满足,系统才可能正常运行起来
init=/linuxrc init进程的位置。
console=ttySAC0 终端对应tty设备,因此,在引导系统前,串口驱动移植应当完成
kernel mtd 分区与UBOOT 分区的理解相关推荐
- 关于NAND flash的MTD分区与uboot中分区的理解 .
今天做内核移植,准备添加NAND flash的驱动,做到MTD分区时,想起在一本书上看到的一句话,说的是分区时每个区之间没有间隙,前一个区的结束地址是后一个区的起始地址.可是当我看我的开发板的教程时, ...
- 详解U-boot分区及内核更新的实现
http://zhuairlunjj.blog.163.com/blog/static/80050945201071395832970/ U-boot分区及内核更新的实现 一 问题 提出 1) 在没有 ...
- SQL文档阅读笔记-对水平分区和垂直分区理解
目录 官方语言 土话解释 官方语言 SELECT(查询)关键字是两个或两个以上的有关系的集合组成的一个统一集合叫 水平分区. PROJECT(投影)关键字是把1个关系差分为2个叫 垂直分区. 注意这里 ...
- Linux 创建MBR的磁盘的扩展分区、逻辑分区相关问题(parted)
>主要参考:parted空闲空间添加分区 >参考截图: 1.实验环境搭建:添加一块硬盘,并将该磁盘转换成MBR格式 [添加成功后查看结果] 2.讲该硬盘的格式转换成MBR格式(msdos) ...
- 高通机型刷机包的分区解析 了解分区基本常识
目前国内机型大都常见的一般就是MTK与高通芯片.今天的帖子给友友梦简单说明下高通刷机包中一些分区的作用和说明.了解分区基本常识 有些分区只是个人对其的理解.可能不是那么贴切.请不要在意 NON-HL ...
- linux挂载分区失败,Ubuntu分区挂载错误与Grub引导错误的修复
可以启动,但启动到一半的时候提示检查分区出错"fsck died with exit status 8",这时还可以通过Ctrl+Alt+Delete进入桌面,是因为Ubuntu ...
- mysql 表分区 django_MySQL partition分区I
Mysql5.1已经发行很久了,本文根据官方文档的翻译和自己的一些测试,对Mysql分区表的局限性做了一些总结,因为个人能力以及测试环境的原因,有可能有错误的地方,还请大家看到能及时指出,当然有兴趣的 ...
- redhat linux创建磁盘分区,redhat6.4 挂载硬盘,创建新分区,删除分区
1. 主分区,扩展分区,逻辑分区的联系和区别 一个硬盘可以有1到3个主分区和1个扩展分区,也可以只有主分区而没有扩展分区,但主分区必须至少有1个,扩展分区则最多只有1个,且主分区+扩展分区总共不能超过 ...
- linux 恢复boot分区,Linux boot分区格式化后恢复 示例
在之前的博客我们看了boot分区删除文件后的修复方法,如下: Linux boot 分区损坏重建 示例 https://www.cndba.cn/dave/article/3534 https://w ...
最新文章
- SpringBoot之get请求404
- 中报表导出带表头_来看看Java是 如何优雅的导出 Excel的
- [Qt教程] 第30篇 XML(四)使用流读写XML
- python反转义字符_Python对HTML转义字符进行反转义的实现方法
- 十个提高编码技能的诀窍,你掌握了几个?
- 数据库显示日期时仅仅显示“年-月-日”的问题
- Java—格式化日期/时间
- 2.Linux/Unix 系统编程手册(上) -- 基本概念
- mfc响应鼠标前进后退按键_诚意升级,商务大鼠再临:雷柏MT750S多模无线激光鼠标评测...
- 推荐!12个经典开源人脸识别数据库
- vb.net操作excel文件
- java万年历 for_java万年历
- linux中配置网桥的命令是下列哪一项,linux系统下配置网桥
- 接口是什么?什么是接口?
- ffmpeg录制麦克风声音和pc内部声音(如播放歌曲)---混音
- 物联网技术技术架构以及物联网应用领域的介绍
- INTERN: A New Learning Paradigm Towards General Vision
- 计算机初中教师教材知识测试,开县中小学教师新教材考试初中信息技术
- Qt5.9问题解决 Clock skew detected. Your build may be incomplete,has modification time in the future
- 中国·乌镇互联网产业园项目总投资约100亿元
热门文章
- C# 多线程及同步简介示例
- 常用模块之hashlib,configparser,logging模块
- json及JavaBean转json
- SqlServer中的数据类型UniqueIdentifier
- Entity Framework系列之DataBase First
- Silverlight与WCF之间的通信(5)silverlight应用和wcf服务的发布方法
- vue.config和editorconfig
- SQLServer数据库(二)
- (2.15)备份与还原--使用作业备份、清理过期备份、清理历史记录、事务日志是否备份过...
- CSS属性(根据继承性分为两类)