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)使用中的问题现象表现
- 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.
|
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
|
- 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/
|
- mtdblock挂载成功,单擦除后卸载失败
01
|
/ $ flash_eraseall /dev/mtd/2 <span></span> Erasing 128 Kibyte @ 8e0000 -- 98 % complete.
|
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)
|
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
|
通过上面的不断尝试和错误反馈,我把方案基本验证通过了,只是对其中的原理不清楚:
- 为什么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设备文件
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
|
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
|
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
|
可以看到有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)
|
3
|
fprintf (stderr, "%s: %s: unable to get MTD device info\n" ,exe_name, mtd_device);
|
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
|
08
|
254 0 30760960 mmcblk0
|
09
|
254 1 30756864 mmcblk0p1
|
后面的两个是SD块设备的分区大小。每个block的大小是1KB。
MTD设备分区和总结
通过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"
|
可以发现,实际上mtdN和mtdblockN描述的是同一个MTD分区,对应同一个硬件分区,两者的大小是一样的,只不过是MTD设备层提供给上层的视图不一样,给上层提供了字符和块设备两种操作视图——为了上层使用的便利和需要,比如mount命令的需求,你只能挂载块设备(有文件系统),而不能对字符设备进行挂载,否则会出现上面的现象2:无效参数。
这里对于mtd和mtdblock设备的使用场景进行简单总结:
- mtd-utils工具只能应用与/dev/mtdN的MTD字符设备
- mount、umount命令只对/dev/mtdblockN的MTD块设备有效
- /dev/mtdN和/dev/mtdblockN是同一个MTD设备的同一个分区(N一样)
MTD应用学习:mtd和mtdblock的区别相关推荐
- mtd和mtdblock的区别
原文地址:http://my.oschina.net/shelllife/blog/123482 做升级方案用到了mtd-utils中的flash_eraseall和flash_cp两个工具,在进行方 ...
- Linux系统中/dev/mtd与/dev/mtdblock的区别
MTD(memory technology device内存技术设备)是用于访问memory设备(ROM.flash)的Linux的子系统.MTD的主要目的是为了使新的memory设备的驱动更加简单, ...
- linux mtd 命令,Linux MTD介绍
1. 介绍 MTD,即Memory Technology Device,值得是内存技术设备 字符设备和块设备的区别在于前者只能被顺序读写,后者可以随机访问:同时,两者读写数据的基本单元不同 字符设备: ...
- MTD层次、MTD设备驱动接口、Nor Flash/Nand Flash驱动
Flash设备驱动及接口分为4层:设备节点,MTD设备层.MTD原始设备层(属于内核的子系统)和硬件驱动层 块设备与文件系统的关系: (1)MTD+MTDblock+fat (2)MTD+NFTL+f ...
- 机器学习、数据科学、人工智能、深度学习和统计学之间的区别!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:Vincent Granville,来源:机器之心 在这篇文章中, ...
- 一文读懂机器学习、数据科学、人工智能、深度学习和统计学之间的区别!
点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 作者:Vincent Granville 来源:机器之心公众号 链接:http://www.d ...
- 一文读懂机器学习、数据科学、人工智能、深度学习和统计学之间的区别
在这篇文章中,数据科学家与分析师 Vincent Granville 明晰了数据科学家所具有的不同角色,以及数据科学与机器学习.深度学习.人工智能.统计学.物联网.运筹学和应用数学等相关领域的比较和重 ...
- 论学习和工作的最大区别
论学习和工作的最大区别 版主我是一个刚毕业进入工作岗位的大学生.之前有过一段实习的经历,在58同城实习了有半年.在实习期间,接触工作都是一般的小case,而且都是有人带着你做,甚至有些公司的实 ...
- 机器学习和深度学习的三点关键区别
机器学习和深度学习的三点关键区别 最简单.最重要的三点区别 深度学习是机器学习的一种子类,通常我们讲的机器学习是传统机器学习方法,比较也是建立于传统机器学习和深度学习两者的区别. 学习的东西不同 训练 ...
最新文章
- 奇葩问题解决-----解决异常情况下的黑屏
- python批量读取文件夹中的所有excel文件-python遍历文件夹下所有excel文件
- Java编译环境的构建
- 算法提高 c++_ch02_01 (强制类型转换)
- python运行程序的快捷键_在Python集成开发环境中,可使用快捷键()运行程序。...
- idea在分屏拖不回来_朋友圈赏花晒照新玩法,宫格分屏视频!
- 次世代游戏设计的相关介绍
- Python字符串等于
- 打印快递面单pdf_如何开通使用拼多多电子面单?
- 文献管理三剑客之endnote broken attachments
- OPNsense用户手册-基于虚拟机和云的安装
- CSU1256(天朝的单行道)
- Dispatch简介
- matlab shading颜色设置,关于matlab中pcolor显示图片时的shading设置问题
- 利用计算机程序快速得到9*9大小数独的解法
- 网页设计成品DW静态网页Html5响应式css3——电影网站bootstrap制作(4页)
- 怎么把图片压缩到200K以内?如何在线压缩图片大小?
- oceanus-58总体框架理解
- 20条职场潜规则!小心那些城府很深的人(建议收藏)
- 无聊与兴奋 《幸福之路》读书笔记
热门文章
- DB2 SQLSTATE 讯息(二)
- 系统设计中的6W理论
- PyQt5笔记之表格(Table Widget)
- 登陆淘宝账号,提示证书过期
- 最好用的ftp工具,8款超级好用的最好用的ftp工具
- Windows10系统自带电脑硬件检测工具的使用步骤--win10专业版
- Linux 端口限流(tc + iptables)
- 小白都会用的低代码大数据ETL工具又来了
- 汽车标准:全球EMC试验标准汇总。
- Mybatisplus代码生成器(界面插件)