Linux系统中/dev/mtd与/dev/mtdblock的区别
MTD(memory technology device內(nèi)存技術(shù)設(shè)備)是用于訪問(wèn)memory設(shè)備(ROM、flash)的Linux的子系統(tǒng)。MTD的主要目的是為了使新的memory設(shè)備的驅(qū)動(dòng)更加簡(jiǎn)單,為此它在硬件和上層之間提供了一個(gè)抽象的接口。MTD的所有源代碼在/drivers/mtd子目錄下。我將CFI接口的MTD設(shè)備分為四層(從設(shè)備節(jié)點(diǎn)直到底層硬件驅(qū)動(dòng)),這四層從上到下依次是:設(shè)備節(jié)點(diǎn)、MTD設(shè)備層、MTD原始設(shè)備層和硬件驅(qū)動(dòng)層。
MTD字符驅(qū)動(dòng)程序允許直接訪問(wèn)flash器件,通常用來(lái)在flash上創(chuàng)建文件系統(tǒng),也可以用來(lái)直接訪問(wèn)不頻繁修改的數(shù)據(jù)。
MTD塊設(shè)備驅(qū)動(dòng)程序可以讓flash器件偽裝成塊設(shè)備,實(shí)際上它通過(guò)把整塊的erase block放到ram里面進(jìn)行訪問(wèn),然后再更新到flash,用戶(hù)可以在這個(gè)塊設(shè)備上創(chuàng)建通常的文件系統(tǒng)。
?
1. /dev/mtdN 是Linux 中的MTD架構(gòu)中,系統(tǒng)自己實(shí)現(xiàn)的mtd分區(qū)所對(duì)應(yīng)的字符設(shè)備(將mtd設(shè)備分成多個(gè)區(qū),每個(gè)區(qū)就為一個(gè)字符設(shè)備),其里面添加了一些ioctl,支持很多命令,如MEMGETINFO,MEMERASE等。
而mtd-util中的flash_eraseall等工具,就是以這些ioctl為基礎(chǔ)而實(shí)現(xiàn)的工具,實(shí)現(xiàn)一些關(guān)于Flash的操作。比如,mtd 工具中的 flash_eraseall中的:
if (ioctl(fd, MEMGETINFO, &meminfo) != 0) {
?? fprintf(stderr, "%s: %s: unable to get MTD device info\n", exe_name, mtd_device);
?? return 1;
}
其中,MEMGETINFO,就是Linux MTD中的drivers/mtd/mtdchar.c中的:
static int mtd_ioctl(struct inode *inode, struct file *file,
?????? u_int cmd, u_long arg)
{
。。。。。
case MEMGETINFO:
?? info.type = mtd->type;
?? info.flags = mtd->flags;
?? info.size = mtd->size;
?? info.erasesize = mtd->erasesize;
?? info.writesize = mtd->writesize;
?? info.oobsize = mtd->oobsize;
?? /* The below fields are obsolete */
?? info.ecctype = -1;
?? info.eccsize = 0;
?? if (copy_to_user(argp, &info, sizeof(struct mtd_info_user)))
??? return -EFAULT;
?? break;
。。。
}
而/dev/mtdblockN,是Nand Flash驅(qū)動(dòng)中,驅(qū)動(dòng)用add_mtd_partitions()添加MTD設(shè)備分區(qū)(其實(shí)就是將mtd設(shè)備進(jìn)行不同的分區(qū),當(dāng)mtd設(shè)備還是一樣的,所以mtdblock分區(qū)與mtd分區(qū)肯定是對(duì)應(yīng)的),而生成的對(duì)應(yīng)的塊設(shè)備。
根據(jù)以上內(nèi)容,也就更加明白,為什么不能用nandwrite,flash_eraseall,flash_erase等工具去對(duì)/dev/mtdblockN去操作了。因?yàn)?strong>/dev/mtdblock中不包含對(duì)應(yīng)的ioctl,也就沒(méi)有定義對(duì)應(yīng)的命令,不支持你這么操作。
2. mtd char 設(shè)備的主設(shè)備號(hào)是90,而mtd block設(shè)備的主設(shè)備號(hào)是31:
# ls /dev/mtd* -l
crw-r-----??? 1 root???? root????? 90,?? 0 May 30 2007 /dev/mtd0
crw-r-----??? 1 root???? root????? 90,?? 2 May 30 2007 /dev/mtd1
crw-r-----??? 1 root???? root????? 90,?? 4 Jul 17 2009 /dev/mtd2
crw-r-----??? 1 root???? root????? 90,?? 6 May 30 2007 /dev/mtd3
crwxrwxrwx??? 1 root???? root????? 90,?? 8 May 30 2007 /dev/mtd4
crwxrwxrwx??? 1 root???? root????? 90, 10 May 30 2007 /dev/mtd5
crwxrwxrwx??? 1 root???? root????? 90, 12 May 30 2007 /dev/mtd6
crwxrwxrwx??? 1 root???? root????? 90, 14 May 30 2007 /dev/mtd7
crwxrwxrwx??? 1 root???? root????? 90, 16 May 30 2007 /dev/mtd8
crwxrwxrwx??? 1 root???? root????? 90, 18 May 30 2007 /dev/mtd9
# ls /dev/mtdblock* -l
brw-r-----??? 1 root???? root????? 31,?? 0 May 30 2007 /dev/mtdblock0
brw-r-----??? 1 root???? root????? 31,?? 1 May 30 2007 /dev/mtdblock1
brw-r-----??? 1 root???? root????? 31,?? 2 May 30 2007 /dev/mtdblock2
brw-r-----??? 1 root???? root????? 31,?? 3 May 30 2007 /dev/mtdblock3
brwxrwxrwx??? 1 root???? root????? 31,?? 4 May 30 2007 /dev/mtdblock4
brwxrwxrwx??? 1 root???? root????? 31,?? 5 May 30 2007 /dev/mtdblock5
brwxrwxrwx??? 1 root???? root????? 31,?? 6 May 30 2007 /dev/mtdblock6
brwxrwxrwx??? 1 root???? root????? 31,?? 7 May 30 2007 /dev/mtdblock7
brwxrwxrwx??? 1 root???? root????? 31,?? 8 May 30 2007 /dev/mtdblock8
brwxrwxrwx??? 1 root???? root????? 31,?? 9 May 30 2007 /dev/mtdblock9
此設(shè)備號(hào),定義在/include/linux/mtd/mtd.h中 :
#define MTD_CHAR_MAJOR?? 90
#define MTD_BLOCK_MAJOR 31
3. 其中,mtd的塊設(shè)備的大小,可以通過(guò)查看分區(qū)信息獲得:
# cat /proc/partitions
major minor #blocks name
31???? 0?????? 1024 mtdblock0
31???? 1?????? 8192 mtdblock1
31???? 2???? 204800 mtdblock2
31???? 3????? 65536 mtdblock3
31???? 4???? 225280 mtdblock4
上面中顯示的塊設(shè)備大小,是block的數(shù)目,每個(gè)block是1KB。
而每個(gè)字符設(shè)備,其實(shí)就是對(duì)應(yīng)著上面的每個(gè)塊設(shè)備。即/dev/mtd0對(duì)應(yīng)/dev/mtdblock0,其他以此類(lèi)推。換句話(huà)說(shuō),mtdblockN的一些屬性,也就是mtdN的屬性,比如大小。
4。對(duì)每個(gè)mtd字符設(shè)備的操作,比如利用nandwrite去對(duì)/dev/mtd0寫(xiě)數(shù)據(jù),實(shí)際就是操作/dev/mtdblock0。
而這些操作里面涉及到的偏移量offset,都指的是此mtd 分區(qū)內(nèi)的偏移。比如向/dev/mtd1的offset為0的位置寫(xiě)入數(shù)據(jù),實(shí)際操作的是物理偏移offset=/dev/mtd0的大小=1MB=0x100000。
5.mtd的字符設(shè)備和塊設(shè)備的命名規(guī)則,可以參考下表:
| mtdN | char device | char | 90 |
| mtdrN | char device | char | 90 |
| mtdblockN | block device, read-only block device, JFFS, and JFFS2 | block | 31 |
| nftlLN | NFTL | block | 93 |
| ftlLN | FTL | block | 44 |
| mtdN | 0 to 32 per increments of 2 | N = minor / 2 |
| mtdrN | 1 to 33 per increments of 2 | N = (minor - 1) / 2 |
| mtdblockN | 0 to 16 per increments of 1 | N = minor |
| nftlLN | 0 to 255 per sets of 16 | L = set;[2] N = minor - (set - 1) x 16; N is not appended to entry name if its value is zero. |
| ftlLN | 0 to 255 per sets of 16 | Same as NFTL. |
The Linux MTD,YAFFS Howto上面這樣寫(xiě)道:
Erase the mtdblock0
/>eraseall /dev/mtd0
Create the mount directory and mount
/>mkdir -p /mnt/flash0
/>mount -t yaffs /dev/mtdblock0 /mnt/flash0
為什么eraseall對(duì)mtd0操作?而不對(duì)mtdblock0操作?nand不是塊設(shè)備嘛,mtdblock就是塊設(shè)備呀。mtd0,mtd1與mtdblock0,mtdblock1是不是一一對(duì)應(yīng)的?
總結(jié)
以上是生活随笔為你收集整理的Linux系统中/dev/mtd与/dev/mtdblock的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 开启本地网易云api接口后端服务器
- 下一篇: win7 计算机 工具,win7小工