关于NAND flash的MTD分区与uboot中分区的理解 .

[uboot]支持mtd分区 参考: https://blog.csdn.net/weixin_42314225/article/details/83241230 问题: (1)uboot支持nor flash sf命令后,如何与网络配置进行版本更新? (2)uboot如何支持MTD设备,Nor flash MTD分区如何进行分区划分? (3)uboot中的分区如何与kernel中的分区进行统一? (4)uboot变量mtdparts=60000000.nor:2m@0x100000(nor_bank0_uboot),4 阅读详情

 

今天做内核移植,准备添加NAND flash的驱动,做到MTD分区时,想起在一本书上看到的一句话,说的是分区时每个区之间没有间隙,前一个区的结束地址是后一个区的起始地址。可是当我看我的开发板的教程时,分区如下:

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分区不一致,将会直接导致系统无法启动!

当然,之前操作的都是物理地址,当内核真正运行起来以后,将开始使用虚拟地址。

UBOOT 启动参数: bootargs 和 bootcmd bootm 0x22000000 -- 从 RECOVERY读取分区到RAM。-- 从KERNEL 分区中读取内核到RAM 0x22000000 地址,然后执行启动内核(bootm), 正常情况,bootcmd 到此结束。mw 1f001cc0 11 --"这里是针对2.4G 的wifi 设置命令"gpio out 4 1 -- gpio4 设置高电平。bootlogo 0 0 0 0 1 -- 执行bootlogo。 阅读详情

相关推荐

kernel mtd 分区与UBOOT 分区的理解

kernel mtd 分区与UBOOT 分区的理解

fdgyfghh的博客 941

关于NAND flash的MTD分区与uboot中分区的理解

今天做内核移植,准备添加NAND flash的驱动,做到MTD分区时,想起在一本书上看到的一句话,说的是分区时每个区之间没有间隙,前一个区的结束地址是后一个区的起始地址。可是当我看我的开发板的教程时,分区如下: static struct mtd_partition smdk_default_nand_part[] = {       [0] = {            .name    

我的天空 我的梦 3万+

Linux下的mtd子系统与源码分析

本文主要介绍mtd子系统,包括mtd子系统框架、spi flash、nor flash和nand flash注册流程,mtd子系统注册设备过程、分区建立过程以及应用试过程等。本文不对flash本身的硬件和上层文件系统做深入介绍描述,读者须有一定的flash硬件认识和文件系统知识。

tang_vincent的博客 1924

(一)U-Boot启动过程--详细版的完全分析

-------------------------------------------------------------------------------------------------------------------------------------------  我们知道,bootloader是系统上电后最初加载运行的代码。它提供了处理器上电复位后最开始需要执行的初始化代码。

hare_Lee的专栏 3万+

EBAZ4205矿卡NAND分区与坏块处理实战:从启动日志看懂MTD分区表与保留区设置

本文深入解析EBAZ4205矿卡的NAND分区与坏块处理技术,从启动日志分析MTD分区表与保留区设置。通过实战案例,详细介绍NAND Flash坏块管理机制、MTD分区优化策略及常见问题解决方案,帮助工程师有效处理嵌入式Linux系统中的存储管理挑战。

weixin_30292843的博客 345

uboot分区介绍

uboot分区介绍

steel0205的专栏 1063

(转)关于NAND flash的MTD分区与uboot中分区的理解

关于NAND flash的MTD分区与uboot中分区的理解 原文:http://blog.csdn.net/yjp19871013/article/details/6933455 分类:ARM/Linux2011-11-03 20:092784人阅读评论(0)收藏举报 flashstruct化工linux终端存储 今天做内核移植,准备添加...

dianchixian5277的博客 123

WSL 运行make提示/lib/modules/xxx/build: No such file or directory. Stop.错误解决办法

WSL运行make提示/lib//modules/xxx文件或目录不存在。 WSL2的内核是修改过的,无法使用 ubuntu上游的内核头文件和modules文件,因此,我们需要手动编译并安装一个版本。

weixin_45668903的博客 1万+

NAND flash的MTD分区与uboot中分区的理解

转自:http://blog.csdn.net/yjp19871013/article/details/6933455 今天做内核移植,准备添加NAND flash的驱动,做到MTD分区时,想起在一本书上看到的一句话,说的是分区时每个区之间没有间隙,前一个区的结束地址是后一个区的起始地址。可是当我看我的开发板的教程时,分区如下: static struct mtd_partition smdk

pojkopj的专栏 1076

成本150元的高性能RDP协议瘦客户机

云终端市场是一个跨度很大的市场。既有数千元的品牌的瘦客户机,也有几百元的瘦客户机,还有200-300元的支持RDP协议的多用户云终端。但是200-300元的多用户终端,在显示性能上不尽人意,一般用于地产中介门店,工厂产线的电子看板等场合。有没有性能更好,价格更低的方案呢? 答案是有。 这个方案就是 二手的x86 瘦客户机 + DoraOS瘦客户机系统免费版(仅支持RDP)。 首先我们看硬件,在某宝搜索 升腾C92 ,找到最低配置的( CPU:J1800,内存:2G,硬盘:8G)。价格都在150以内。

云飞扬的桌面云 7410

Arduino+L298N电机驱动模块避坑指南:从接线到PWM调速的5个常见错误

本文详细解析了使用Arduino与L298N电机驱动模块时,从电源配置、跳线帽使用到PWM调速的5个常见错误与避坑指南。重点阐述了如何正确分离逻辑与电机电源、拔掉ENA/ENB跳线帽以实现PWM调速、理解H桥接线逻辑以控制直流电机正反转,并提供优化代码与散热建议,帮助开发者稳定驱动电机。

rust6ferris的博客 561
上一篇: linux_NandFlash_driver_超详细分析
下一篇: uboot 与系统内核中 MTD分区的关系
flymachine
博客等级 码龄23年 253粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值