MTD技術的基本原理

MTD技術的基本原理

MTD(memory technology device內存技術設備)是用於訪問memory設備(ROM、flash)的Linux的子系統。MTD的主要目的是爲了使新的memory設備的驅動更加簡單,爲此它在硬件和上層之間提供了一個抽象的接口,並進行了一個層次劃分,層次從上到下大致爲:設備文件、MTD設備層、MTD原始設備層、硬件驅動層。MTD的所有源代碼在/drivers/mtd子目錄下。

MTD字符驅動程序允許直接訪問flash器件,通常用來在flash上創建文件系統,也可以用來直接訪問不頻繁修改的數據。
MTD塊設備驅動程序可以讓flash器件僞裝成塊設備,實際上它通過把整塊的erase block放到ram裏面進行訪問,然後再更新到flash,用戶可以在這個塊設備上創建通常的文件系統。

  參考:http://blog.csdn.net/bugouyonggan/article/details/9167213

系統中的MTD設備文件?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

~ $ ls /dev/mtd* -l

crw-rw----    1 root     root      90,   0 Jan  1 00:00 /dev/mtd0

crw-rw----    1 root     root      90,   1 Jan  1 00:00 /dev/mtd0ro

crw-rw----    1 root     root      90,   2 Jan  1 00:00 /dev/mtd1

crw-rw----    1 root     root      90,   3 Jan  1 00:00 /dev/mtd1ro

crw-rw----    1 root     root      90,   4 Jan  1 00:00 /dev/mtd2

crw-rw----    1 root     root      90,   5 Jan  1 00:00 /dev/mtd2ro

crw-rw----    1 root     root      90,   6 Jan  1 00:00 /dev/mtd3

crw-rw----    1 root     root      90,   7 Jan  1 00:00 /dev/mtd3ro

brw-rw----    1 root     root      31,   0 Jan  1 00:00 /dev/mtdblock0

brw-rw----    1 root     root      31,   1 Jan  1 00:00 /dev/mtdblock1

brw-rw----    1 root     root      31,   2 Jan  1 00:00 /dev/mtdblock2

brw-rw----    1 root     root      31,   3 Jan  1 00:00 /dev/mtdblock3

 

/dev/mtd:

crw-rw-rw-    1 root     root      90,   0 Jan  1 00:00 0

cr--r--r--    1 root     root      90,   1 Jan  1 00:00 0ro

crw-rw-rw-    1 root     root      90,   2 Jan  1 00:00 1

cr--r--r--    1 root     root      90,   3 Jan  1 00:00 1ro

crw-rw-rw-    1 root     root      90,   4 Jan  1 00:00 2

cr--r--r--    1 root     root      90,   5 Jan  1 00:00 2ro

crw-rw-rw-    1 root     root      90,   6 Jan  1 00:00 3

cr--r--r--    1 root     root      90,   7 Jan  1 00:00 3ro

 

/dev/mtdblock:

brw-------    1 root     root      31,   0 Jan  1 00:00 0

brw-------    1 root     root      31,   1 Jan  1 00:00 1

brw-------    1 root     root      31,   2 Jan  1 00:00 2

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

2

3

4

5

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中的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文件系統進行查看:

1

2

3

4

5

6

7

8

9

10

~ $ cat /proc/partitions

major minor  #blocks  name

 

  31     0        512 mtdblock0

  31     1       1024 mtdblock1

  31     2       5632 mtdblock2

  31     3       9216 mtdblock3

 254     0   30760960 mmcblk0    

 254     1   30756864 mmcblk0p1

~ $

後面的兩個是SD塊設備的分區大小。每個block的大小是1KB。

MTD設備分區和總結

通過proc文件系統查看mtd設備的分區情況:

1

2

3

4

5

6

7

~ $ cat /proc/mtd

dev:    size   erasesize  name

mtd0: 00080000 00020000 "boot"

mtd1: 00100000 00020000 "kernel"

mtd2: 00580000 00020000 "roofs70"

mtd3: 00900000 00020000 "app"

~ $

可以發現,實際上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一樣)

 

發佈了11 篇原創文章 · 獲贊 10 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章