MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单。
/dev/mtdN 是MTD架构中实现的mtd分区所对应的字符设备(将mtd设备分成多个区,每个区就为一个字符设备),其里面添加了一些ioctl,支持很多命令,如MEMGETINFO,MEMERASE等。
/dev/mtdblockN,是Flash驱动中用add_mtd_partitions()添加MTD设备分区,而生成的对应的块设备。MTD块设备驱动程序可以让flash器件伪装成块设备,实际上它通过把整块的erase block放到ram里面进行访问,然后再更新到flash,用户可以在这个块设备上创建通常的文件系统。
实际上mtdN和mtdblockN描述的是同一个MTD分区,对应同一个硬件分区,两者的大小是一样的,只不过是MTD设备层提供给上层的视图不一样,给上层提供了字符和块设备两种操作视图——为了上层使用的便利和需要。
mount、umount命令只对/dev/mtdblockN的MTD块设备有效
/dev/mtdN和/dev/mtdblockN是同一个MTD设备的同一个分区(N一样)
ls -l mtd*
crw-rw---- 1 root root 90, 0 Jan 1 00:00 mtd0
crw-rw---- 1 root root 90, 1 Jan 1 00:00 mtd0ro
crw-rw---- 1 root root 90, 2 Jan 1 00:00 mtd1
crw-rw---- 1 root root 90, 3 Jan 1 00:00 mtd1ro
crw-rw---- 1 root root 90, 4 Jan 1 00:00 mtd2
crw-rw---- 1 root root 90, 5 Jan 1 00:00 mtd2ro
crw-rw---- 1 root root 90, 6 Jan 1 00:00 mtd3
crw-rw---- 1 root root 90, 7 Jan 1 00:00 mtd3ro
brw-rw---- 1 root root 31, 0 Jan 1 00:00 mtdblock0
brw-rw---- 1 root root 31, 1 Jan 1 00:00 mtdblock1
brw-rw---- 1 root root 31, 2 Jan 1 00:00 mtdblock2
brw-rw---- 1 root root 31, 3 Jan 1 00:00 mtdblock3
通过proc文件系统查看mtd设备的分区情况
# cat /proc/mtd
dev: size erasesize name
mtd0: 00200000 00020000 "boot"
mtd1: 00200000 00020000 "upgrade"
mtd2: 00800000 00020000 "kernel"
mtd3: 04000000 00020000 "recovery"
mtd4: 03400000 00020000 "rootfs"
mtd5: 08000000 00020000 "hdsys"
cat /proc/partitions
major minor #blocks name
31 0 2048 mtdblock0
31 1 8192 mtdblock1
31 2 16384 mtdblock2
31 3 235520 mtdblock3
/*
* mtdblock3
*/
mkdir /recovery
mount -t yaffs2 /dev/mtdblock3 /recovery
/*
* mtd-utils
*/
mtdinfo /dev/mtd3
mtd3
Name: recovery
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 512 (67108864 bytes, 64.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:6
Bad blocks are allowed: true
Device is writable: true
ftl_check /dev/mtd3
Memory region info:
Region size = 64 mb Erase block size = 128 kb
mtd_debug info /dev/mtd2
mtd.type = MTD_NANDFLASH
mtd.flags = MTD_CAP_NANDFLASH
mtd.size = 8388608 (8M)
mtd.erasesize = 131072 (128K)
mtd.writesize = 2048 (2K)
mtd.oobsize = 64
regions = 0
mtdinfo /dev/mtd2
mtd2
Name: kernel
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 64 (8388608 bytes, 8.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:4
Bad blocks are allowed: true
Device is writable: true
mtdinfo /dev/mtd4
mtd4
Name: rootfs
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 416 (54525952 bytes, 52.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:8
Bad blocks are allowed: true
Device is writable: true