Linux系統中/dev/mtd與/dev/mtdblock的區別

MTD(memory technology device內存技術設備)是用于訪問memory設備(ROM、flash)的Linux的子系統。MTD的主要目的是為了使新的memory設備的驅動更加簡單,為此它在硬件和上層之間提供了一個抽象的接口。MTD的所有源代碼在/drivers/mtd子目錄下。我將CFI接口的MTD設備分為四層(從設備節點直到底層硬件驅動),這四層從上到下依次是:設備節點、MTD設備層、MTD原始設備層和硬件驅動層。
MTD字符驅動程序允許直接訪問flash器件通常用來在flash上創建文件系統,也可以用來直接訪問不頻繁修改的數據。
MTD塊設備驅動程序可以讓flash器件偽裝成塊設備,實際上它通過把整塊的erase block放到ram里面進行訪問,然后再更新到flash,用戶可以在這個塊設備上創建通常的文件系統。

?

1. /dev/mtdN 是Linux 中的MTD架構中,系統自己實現的mtd分區所對應的字符設備(將mtd設備分成多個區,每個區就為一個字符設備),其里面添加了一些ioctl,支持很多命令,如MEMGETINFO,MEMERASE等。

而mtd-util中的flash_eraseall等工具,就是以這些ioctl為基礎而實現的工具實現一些關于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驅動中,驅動用add_mtd_partitions()添加MTD設備分區(其實就是將mtd設備進行不同的分區,當mtd設備還是一樣的,所以mtdblock分區與mtd分區肯定是對應的),而生成的對應的塊設備

根據以上內容,也就更加明白,為什么不能用nandwrite,flash_eraseall,flash_erase等工具去對/dev/mtdblockN去操作了。因為/dev/mtdblock中不包含對應的ioctl,也就沒有定義對應的命令,不支持你這么操作。

2. mtd char 設備的主設備號是90,而mtd block設備的主設備號是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

此設備號,定義在/include/linux/mtd/mtd.h中 :

#define MTD_CHAR_MAJOR?? 90
#define MTD_BLOCK_MAJOR 31

3. 其中,mtd的塊設備的大小,可以通過查看分區信息獲得:

# 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

上面中顯示的塊設備大小,是block的數目,每個block是1KB。

而每個字符設備,其實就是對應著上面的每個塊設備。即/dev/mtd0對應/dev/mtdblock0,其他以此類推。換句話說,mtdblockN的一些屬性,也就是mtdN的屬性,比如大小。

4。對每個mtd字符設備的操作,比如利用nandwrite去對/dev/mtd0寫數據,實際就是操作/dev/mtdblock0。

而這些操作里面涉及到的偏移量offset,都指的是此mtd 分區內的偏移。比如向/dev/mtd1的offset為0的位置寫入數據,實際操作的是物理偏移offset=/dev/mtd0的大小=1MB=0x100000。

5.mtd的字符設備和塊設備的命名規則,可以參考下表:

Table 7-1. MTD /dev entries, corresponding MTD user modules, and relevant device major numbers

/dev entry

Accessible MTD user module

Device type

Major number

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

Table 7-2. MTD /dev entries, minor numbers, and naming schemes

/dev entry

Minor number range

Naming scheme

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上面這樣寫道:
Erase the mtdblock0
/>eraseall /dev/mtd0
Create the mount directory and mount
/>mkdir -p /mnt/flash0
/>mount -t yaffs /dev/mtdblock0 /mnt/flash0
為什么eraseall對mtd0操作?而不對mtdblock0操作?nand不是塊設備嘛,mtdblock就是塊設備呀。mtd0,mtd1與mtdblock0,mtdblock1是不是一一對應的?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253428.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253428.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253428.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python判斷變量的數據類型的兩種方法

2019獨角獸企業重金招聘Python工程師標準>>> 1、isinstance(變量名,類型) def varargsql(self, sql, *args):if isinstance(args, tuple):self.cursor.execute(sql, args)self.conn.commit() 2、通過與其他已知類型的常量進行對比(type()&…

svn圖標的含義

http://www.cnblogs.com/genhaosan/articles/5129791.html 轉載于:https://www.cnblogs.com/wangc04/p/6400477.html

基于事件的視覺傳感器

在之前的文章里 人工智能與圖像傳感器_滄海一升的博客-CSDN博客_人工智能和傳感器的關系第一類是圖像傳感器與人工智能計算相結合,即圖像傳感器模組除了可以輸出圖像之外,還可以直接輸出人工智能算法計算的結果。另一類智能圖像傳感器則是為人工智能應用專門設計的圖像傳感器…

RocketMQ多Master多Slave模式部署

每個 Master 配置一個 Slave,有多對Master-Slave,HA采用同步雙寫方式,主備都寫成功,向應用返回成功。 優點:數據與服務都無單點,Master宕機情況下,消息無延遲,服務可用性與數據可用性…

FPGA的ip核之概念和分類

ip核之概念和分類 IP(Intellectual Property)內核模塊是一種預先設計好的甚至已經過驗證的具有某種確定功能的集成電路、器件或部件。它有幾種不同形式。IP內核模塊有行為(behavior)、結構(structure)和物理…

codeforces 1045 D. Interstellar battle

題目大意:一顆樹,給定每個點消失的概率,求出連通塊的期望值。要求支持修改消失概率的操作并且給出每次修改過后的期望值。注意被破壞的點不能算入連通塊中。 數據范圍,時限1S。 傳送門 D. Interstellar battle 我們考慮做有根樹的…

RecyclerView(滾動控件)的用法

1.首先在build.gradle中添加依賴庫 compile com.android.support:recyclerview-v7:24.2.1 2.修改activity_main.xml <LinearLayout ......<android.support.v7.widget.RecyclerViewandroid:id"id/recycler_view"android:layout_width"maych_parent"a…

Verilog中case(1‘b1)的使用說明

在用Verilog進行RTL代碼編寫的時候基本不會用到case(1‘b1)&#xff0c;而且一般的語法說明也如下&#xff1a; case(case_expr)condition1 : true_statement1 ;condition2 : true_statement2 ;……default : default_sta…

Cookie中文存儲頁面500問題

前段時間做cookie存儲&#xff0c;直接用的菜鳥教程中的cookie設置方法&#xff0c;方法如下&#xff1a; function setCookie(cname,cvalue,exdays) {var d new Date();d.setTime(d.getTime()(exdays*24*60*60*1000));var expires "expires"d.toGMTString();docum…

Behave用戶自定義數據類型

在step句子中, 所有的參數默認是string類型, 如果用戶想使用復雜的或者其他數據類型, 就需要了解以下bahave中的數據類型. behave的數據類型轉換器是在parse和cfparse中支持. parse模塊是string.format的逆函數. parse_type是基于parse的擴展, 簡化了自定義數據類型的產生. pa…

IC Compiler指南——數據準備

一、概述 ICC數據設置的文件關系框圖如圖&#xff1a; 后端工具在數據設置階段需要對兩大類數據進行設置&#xff0c;包括從前端設計繼承的綜合數據 以及后端設計需要的物理數據。 綜合數據主要包括前端邏輯綜合已經設置過的邏輯與時序庫文件、設計約束文件sdc以 及綜合網表文…

iOS Xcode全面剖析

前言 前幾天在公司內部做了一次關于iOS的入門分享&#xff0c;聽眾有PHP、Web、Android、測試、產品、UI等&#xff0c;主旨是力求不懂iOS的人能了解iOS的開發流程&#xff0c;聽后都能創建一個iOS項目并打印HelloWorld。&#xff08;這是背景&#xff09;你想想就這么點需求&a…

VS2013編譯OBS源碼

obs源碼來之&#xff1a;https://sourceforge.net/projects/obsproject/ 下載源碼之后直接打開sln索引文件就行 項目打開之后 obs作為啟動項 直接編譯就行&#xff0c;正常應該一下就能編譯成功。 在運行的時候可能會報錯&#xff1a; 這個問題就需要制定一下編譯輸出路徑&…

Y/C分離/2/3D濾波器

待整理http://blog.csdn.net/yangzhifu/article/details/7388101 http://wenku.baidu.com/view/f997d705cc1755270722086d.html

構建之法閱讀筆記04

敏捷開發是一系列價值觀和方法論的集合。在敏捷的大旗下&#xff0c;我們可以看到好幾種軟件開發的方法論&#xff0c;我們在這里主要分析Scrum這個方法論。 從Scrum方法論中分析&#xff0c;敏捷開發一共分四步&#xff1a; 第一步&#xff1a;找出完成產品需要做的事情——Pr…

js圖片切換

1.不同方式的圖片切換 功能點:   1.頁面默認循環切換,循環切換按鈕獲得焦點   2.點擊順序切換時,順序切換按鈕獲得焦點     點擊上一張時,當圖片為第一張時,圖片不再進行切換,圖片張數和描述也不在變動;     點擊下一張時,當圖片為最后一張時,圖片不再進行切換,圖片…

網絡攝象機常用傳輸協議

多播路由是一個很好的技術&#xff0c;在Internet上實現了對數據的“廣播”&#xff0c;不同于廣播的是&#xff0c;由于廣播風暴的問題&#xff0c;路由器是禁止廣播數據跨路由傳送的。而多播則很好的解決了這個問題。現在M$軟件如&#xff1a;Netmeeting&#xff0c;WMS就廣泛…

CIS關鍵工藝技術概覽

相機作為一種媒介&#xff0c;可以記錄光所體現的物體&#xff0c;使人們能夠主觀或客觀地表達各種情感和思想。當代人類身處于一個所謂的“數字游牧時代”&#xff0c;人們攜帶各類移動數碼設備&#xff0c;生活不受時空的限制。在當今時代&#xff0c;相較于膠片相機&#xf…

Properties

Properties配置文件說明 Properties類對應.properties文件。文件內容是鍵值對&#xff0c;鍵值對之間使用""或空格隔開。開頭是"#"的表示注釋Properties類在加載.properties文件時使用的iso8859-1的編碼。所以這個文件中的中文要特殊處理&#xff1a;如果這…