MTD应用学习:mtd和mtdblock的区别

http://my.oschina.net/shelllife/blog/123482

http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076075.html

今天做升级方案用到了mtd-utils中的flash_eraseall和flash_cp两个工具,在进行方案验证的时候,遭遇到各种不解和疑惑,因对MTD的原理不熟悉,所以只能多次尝试,虽然最后把方案搞定了,不过觉得MTD中的mtd和mtdblock区别这块还是值得总结学习一下。这里先说明一下问题现象,然后在进行具体的区别原理解释。

 

MTD设备(Nor Flash)使用中的问题现象表现

  1. mtd-utils工具对mtd和mtdblock分区设备的区别处理

    1 / $ flash_eraseall /dev/mtdblock/2
    2 flash_eraseall: /dev/mtdblock/2: unable to get MTD device info
    3 / $ flash_eraseall /dev/mtdblock/2
    4 flash_eraseall: /dev/mtdblock/2: unable to get MTD device info
    5 / $ flash_eraseall /dev/mtd/2
    6 Erasing 128 Kibyte @ 8e0000 -- 98 % complete.
    7 / $ ls
    1 / $ flashcp rootfs_version /dev/mtdblock2
    2 This doesn't seem to be a valid MTD flash device!
    3 / $ flashcp rootfs_version /dev/mtdblock/2
    4 This doesn't seem to be a valid MTD flash device!
    5 / $ flashcp rootfs_version /dev/mtd2
    6 / $ ls
  2. mtd和mtdblock分区设备mount时的区别
    1 / $ mount -t jffs2 /dev/mtd/2 qqzm/
    2 mount: Mounting /dev/mtd/2 on qqzm/ failed: Invalid argument
    3 / $ mount -t jffs2 /dev/mtd2 qqzm/
    4 mount: Mounting /dev/mtd2 on qqzm/ failed: Invalid argument
    5 / $ mount -t jffs2 /dev/mtdblock/2 qqzm/
    6 / $ ls
  3. mtdblock挂载成功,单擦除后卸载失败
    01 / $ flash_eraseall /dev/mtd/2 <span></span> Erasing 128 Kibyte @ 8e0000 -- 98 % complete.
    02 /qqzm $ mount
    03 /dev/root on / type jffs2 (rw,noatime)
    04 proc on /proc type proc (rw,nodiratime)
    05 sysfs on /sys type sysfs (rw)
    06 devfs on /dev type devfs (rw)
    07 devpts on /dev/pts type devpts (rw)
    08 /dev/mmcblk0p1 on /mnt/sd type vfat (rw,nodiratime,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1)
    09 /dev/mtdblock/2 on /qqzm type jffs2 (rw,noatime)
    10 none on /qqzm/www/cgi-bin/tmp type ramfs (rw)
    11 /qqzm $ cd ..
    12 / $ umount /qqzm
    13 umount: Couldn't umount /qqzm: Inappropriate ioctl for device
    14 / $ umount /dev/mtdblock/2
    15 umount: Couldn't umount /dev/mtdblock/2: Inappropriate ioctl for device
    16 / $

 

通过上面的不断尝试和错误反馈,我把方案基本验证通过了,只是对其中的原理不清楚:

  • 为什么mtd和mtdblock明明是同一个设备分区却有不同的操作?
  • mount命令只能挂载块设备吗?
  • 卸载mtdblock设备时,Inappropriate ioctl for device是什么意思?
  • unable to get MTD device info,又是什么意思?

MTD技术的基本原理

MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口,并进行了一个层次划分,层次从上到下大致为:设备文件、MTD设备层、MTD原始设备层、硬件驱动层。MTD的所有源代码在/drivers/mtd子目录下。

系统中的MTD设备文件

01 ~ $ ls /dev/mtd* -l
02 crw-rw----    1 root     root      90,   0 Jan  1 00:00 /dev/mtd0
03 crw-rw----    1 root     root      90,   1 Jan  1 00:00 /dev/mtd0ro
04 crw-rw----    1 root     root      90,   2 Jan  1 00:00 /dev/mtd1
05 crw-rw----    1 root     root      90,   3 Jan  1 00:00 /dev/mtd1ro
06 crw-rw----    1 root     root      90,   4 Jan  1 00:00 /dev/mtd2
07 crw-rw----    1 root     root      90,   5 Jan  1 00:00 /dev/mtd2ro
08 crw-rw----    1 root     root      90,   6 Jan  1 00:00 /dev/mtd3
09 crw-rw----    1 root     root      90,   7 Jan  1 00:00 /dev/mtd3ro
10 brw-rw----    1 root     root      31,   0 Jan  1 00:00 /dev/mtdblock0
11 brw-rw----    1 root     root      31,   1 Jan  1 00:00 /dev/mtdblock1
12 brw-rw----    1 root     root      31,   2 Jan  1 00:00 /dev/mtdblock2
13 brw-rw----    1 root     root      31,   3 Jan  1 00:00 /dev/mtdblock3
14  
15 /dev/mtd:
16 crw-rw-rw-    1 root     root      90,   0 Jan  1 00:00 0
17 cr--r--r--    1 root     root      90,   1 Jan  1 00:00 0ro
18 crw-rw-rw-    1 root     root      90,   2 Jan  1 00:00 1
19 cr--r--r--    1 root     root      90,   3 Jan  1 00:00 1ro
20 crw-rw-rw-    1 root     root      90,   4 Jan  1 00:00 2
21 cr--r--r--    1 root     root      90,   5 Jan  1 00:00 2ro
22 crw-rw-rw-    1 root     root      90,   6 Jan  1 00:00 3
23 cr--r--r--    1 root     root      90,   7 Jan  1 00:00 3ro
24  
25 /dev/mtdblock:
26 brw-------    1 root     root      31,   0 Jan  1 00:00 0
27 brw-------    1 root     root      31,   1 Jan  1 00:00 1
28 brw-------    1 root     root      31,   2 Jan  1 00:00 2
29 brw-------    1 root     root      31,   3 Jan  1 00:00 3
30 ~ $

可以看到有mtdN和对应的/dev/mtd/N、mtdblockN和对应的/dev/mtdblock/N两类MTD设备,分别是字符设备,主设备号90和块设备,主设备号31。其中/dev/mtd0和/dev/mtd/0是完全等价的,/dev/mtdblock0和/dev/mtdblock/0是完全等价的,而/dev/mtd0和/dev/mtdblock0则是同一个MTD分区的两种不同应用描述,操作上是有区别的。

/dev/mtdN设备

/dev/mtdN 是MTD架构中实现的mtd分区所对应的字符设备(将mtd设备分成多个区,每个区就为一个字符设备),其里面添加了一些ioctl,支持很多命令,如MEMGETINFO,MEMERASE等。

mtd-utils中的flash_eraseall等工具,就是以这些ioctl为基础而实现的工具,实现一些关于Flash的操作。比如,mtd 工具中 flash_eraseall中:

1 if (ioctl(fd, MEMGETINFO, &meminfo) != 0)
2 {
3    fprintf(stderr, "%s: %s: unable to get MTD device info\n",exe_name, mtd_device);
4    return 1;
5 }

MEMGETINFO是Linux MTD中的drivers/mtd/mtdchar.c中的ioctl命令,使用mtd字符设备需要加载mtdchar内核模块。该代码解释了上面的第一个现象。

/dev/mtdblockN设备

/dev/mtdblockN,是Flash驱动中用add_mtd_partitions()添加MTD设备分区,而生成的对应的块设备。MTD块设备驱动程序可以让flash器件伪装成块设备,实际上它通过把整块的erase block放到ram里面进行访问,然后再更新到flash,用户可以在这个块设备上创建通常的文件系统。

而对于MTD块设备,MTD设备层是不提供ioctl的实现方法的,也就不会有对应的MEMGETINFO命令之类,因此不能使用nandwrite,flash_eraseall,flash_erase等工具去对/dev/mtdblockN去进行操作,否则就会出现上面的现象一,同时也解释了现象3——用mtd2擦除分区后,在用mtdblock2进行umount就会造成混乱。

mtd块设备的大小可以通过proc文件系统进行查看:

01 ~ $ cat /proc/partitions
02 major minor  #blocks  name
03  
04   31     0        512 mtdblock0
05   31     1       1024 mtdblock1
06   31     2       5632 mtdblock2
07   31     3       9216 mtdblock3
08  254     0   30760960 mmcblk0   
09  254     1   30756864 mmcblk0p1
10 ~ $

后面的两个是SD块设备的分区大小。每个block的大小是1KB。

MTD设备分区和总结

通过proc文件系统查看mtd设备的分区情况:

1 ~ $ cat /proc/mtd
2 dev:    size   erasesize  name
3 mtd0: 00080000 00020000 "boot"
4 mtd1: 00100000 00020000 "kernel"
5 mtd2: 00580000 00020000 "roofs70"
6 mtd3: 00900000 00020000 "app"
7 ~ $

可以发现,实际上mtdN和mtdblockN描述的是同一个MTD分区,对应同一个硬件分区,两者的大小是一样的,只不过是MTD设备层提供给上层的视图不一样,给上层提供了字符和块设备两种操作视图——为了上层使用的便利和需要,比如mount命令的需求,你只能挂载块设备(有文件系统),而不能对字符设备进行挂载,否则会出现上面的现象2:无效参数。

这里对于mtd和mtdblock设备的使用场景进行简单总结:

  1. mtd-utils工具只能应用与/dev/mtdN的MTD字符设备
  2. mount、umount命令只对/dev/mtdblockN的MTD块设备有效
  3. /dev/mtdN和/dev/mtdblockN是同一个MTD设备的同一个分区(N一样)
时间: 2024-09-30 03:58:50

MTD应用学习:mtd和mtdblock的区别的相关文章

一文读懂机器学习、数据科学、人工智能、深度学习和统计学之间的区别

在这篇文章中,数据科学家与分析师 Vincent Granville 明晰了数据科学家所具有的不同角色,以及数据科学与机器学习.深度学习.人工智能.统计学.物联网.运筹学和应用数学等相关领域的比较和重叠.Granville 介绍说,由于数据科学是一个范围很广的学科,所以他首先介绍了在业务环境中可能会遇到的数据科学家的类型,你甚至可能会发现你自己原来也是某种数据科学家.和其它任何科学学科一样,数据科学也可能会从其它相关学科借用技术.当然,我们也已经开发出了自己的技术库,尤其是让我们可以以自动化的方

拒绝跟风,看机器学习、数据科学、人工智能、深度学习、统计学等的区别

本文作者Vincent Granville通过阐明数据科学家各种各样的角色,以及数据科学与相关领域的不同以及交叉,比如机器学习.深度学习.AI.IoT.统计学.运筹学和应用数学.PS,通过Maxcompute及其配套产品,低廉的大数据分析仅需几步,详情访问https://www.aliyun.com/product/odps. 以下为译文 因为数据科学是个广义的学科,所以这里将从任何业务里都可能会遇到的数据科学家类型开始,通过这个部分或许你能发现自己隐藏的数据科学家潜质:)正如任何科学学科一样,

机器学习、数据科学、人工智能、深度学习、统计学等的区别

因为数据科学是个广义的学科,所以这里将从任何业务里都可能会遇到的数据科学家类型开始,通过这个部分或许你能发现自己隐藏的数据科学家潜质:)正如任何科学学科一样,数据科学家也可能向相关学科学习借鉴,尽管数据科学已经有自己的部分,尤其是自动处理超大规模非结构化数据的方式和算法,甚至不需要人为干涉,就可以做实时处理或者预测. 1. 数据科学家的各种类型 想要开始并且了解一些以前的观点,不妨参考2014年发布的文章" 9 types of data scientists"或者同年另一篇文章比较数

u-boot中分区和内核MTD分区关系

一.u-boot中环境变量与uImage中MTD的分区关系 分区只是内核的概念,就是说A-B地址放内核,C-D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等. 一般我们只需要分3-4个区,第一个为boot区,一个为boot参数区(传递给内核的参数),一个为内核区,一个为文件系统区.(但是有的内核就会有很多分区,比如内核参数会有两个,还有会Logo的地址) 而对于bootloader中只要能将内核下载到A~B区的A地址开始处就可以,C~D区的C起始地址下载文件系统--.这些起始地

uboot环境变量与内核MTD分区关系

uboot 与系统内核中MTD分区的关系: 分区只是内核的概念,就是说A-B地址放内核,C-D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等. 1:在内核MTD中可以定义分区A~B,C~D......并予以绝对的地址赋值给每个分区.我们可以来看看在内核中是怎样来对MTD进行分区的:arch/arm/plat-s3c24xx/common-smdk.c static struct mtd_partition smdk_default_nand_part[] = { [0] = {

Linux MTD系统剖析【转】

转自:http://blog.csdn.net/lwj103862095/article/details/21545791   版权声明:本文为博主原创文章,未经博主允许不得转载. MTD,Memory Technology Device即内存技术设备,在Linux内核中,引入MTD层为NOR FLASH和NAND FLASH设备提供统一接口.MTD将文件系统与底层FLASH存储器进行了隔离. 如上图所示,MTD设备通常可分为四层,从上到下依次是:设备节点.MTD设备层.MTD原始设备层.硬件驱

linux的mtd架构分析【转】

转自:http://blog.csdn.net/column/details/xgbing-linux-mtd.html linux mtd 嵌入式系统的存储有很多不可靠之处.随着使用容量的增大,现在使用得最多的是nand flash.nand flash价格低廉,但它有很多不足之处.nand flash出厂就可能有坏块,随着使用时间的增长... 2014-03-25 09:36    1193 yaffs2与mtd之间的连接 yaffs2工作在VFS和MTD之间. (1)移植yaffs2 在终

利用mtd工具实现嵌入式设备在线升级

版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   主要思路是:通过web post方式将升级文件交给CGI程序处理,然后通过mtd工具实现设备在线升级. 1.页面部分 <form target="_blank" enctype="multipart/form-data" method="POST" action="./update.cgi"> <p>选择升级文件:    

从游戏研发中看学习与抄袭的区别

无可否认,中国游戏产业是通过抄袭建立的基础,然而经过多年的人才储备和市场调节,整个游戏产业的基调已经顺理成章的完成了从代理到研发的转变.有了基础,前来游戏市场淘金的企业也就自然层出不穷,即便是大浪淘沙再凶猛,精于山寨文化的国人总是能找到立足之地.能支撑住庞大游戏产业的市场也在这个过程中逐步壮大,有数据表明,2008年国内网络游戏的总规模为207.8亿元,预计2009年将有49.6%的增长率,国内网络游戏市场规模将达到310.8亿元,比上一年增长约100亿元.如此一个大蛋糕,不来瓜分岂不是对不住自