mtd(memory technology device記憶體技術裝置)是用於訪問memory裝置(rom、flash)的linux的子系統。mtd的主要目的是為了使新的memory裝置的驅動更加簡單,為此它在硬體和上層之間提供了乙個抽象的介面,並進行了乙個層次劃分,層次從上到下大致為:裝置檔案、mtd裝置層、mtd原始裝置層、硬體驅動層。mtd的所有源**在/drivers/mtd子目錄下。
mtd字元驅動程式允許直接訪問flash器件,通常用來在flash上建立檔案系統,也可以用來直接訪問不頻繁修改的資料。
mtd塊裝置驅動程式可以讓flash器件偽裝成塊裝置,實際上它通過把整塊的erase block放到ram裡面進行訪問,然後再更新到flash,使用者可以在這個塊裝置上建立通常的檔案系統。
參考: 2
3 45 6
7 89 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 是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,是
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 45 6
7 89 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。
通過proc檔案系統檢視mtd裝置的分割槽情況:1 2
3 45 6 7
~ $ cat /proc/mtd
dev: size erasesize name
mtd0: 00080000 00020000 "boot"
mtd1: 00100000 00020000 "kernel"
mtd2: 00580000 00020000 "roofs70"
可以發現,實際上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一樣)
raid技術基本原理
近年來,cpu的處理效能保持著高速增長,intel公司在2017年最新發布的i9 7980xe處理器晶元更是達到了18核心36執行緒。但與此同時,硬碟裝置的效能提公升卻不是很大,因此逐漸成為當代計算機整體效能的瓶頸。而且,由於硬碟裝置需要進行持續 頻繁 大量的io操作,相較於其他裝置,其損壞機率也大...
mysql的基本原理 Mysql 基本原理
mysql 基本原理 mysql是一種關聯式資料庫管理系統,關聯式資料庫將資料儲存在不同的表中,而不是將所有資料放在乙個大倉庫內,這樣就增加了速度並提高了靈活性 ysql是資料庫登入命令 uroot預設超級使用者登入 p 預設沒密碼 中寫密碼 mysqladmin uroot password 12...
pwm控制的基本原理 PWM控制的基本原理
pwm pulse width modulation 控制 脈衝寬度調製技術,通過對一系列脈衝的寬度進行調製,來等效地獲得所需要波形 含形狀和幅值 pwm控制技術在逆變電路中應用最廣,應用的逆變電路絕大部分是pwm型,pwm控制技術正是有賴於在逆 變電路中的應用,才確定了它在電力電子技術中的重要地位...