From: http://lansedefeng2005.blog.163.com/blog/static/3683192620071020935272/
Linux MTD 介紹
專有名詞:
1. MTD:Memory Technology Device,記憶體技術裝置,
2. JEDEC:Joint Electron Device Engineering Council,電子電器裝置聯合會
3. CFI:Common Flash Interface,通用Flash介面,Intel發起的一個Flash的介面標準
4. OOB: out of band,某些記憶體支援人員out-of-band資料——例如,NAND flash每512位元組的塊有16個位元組的extra data,用於錯誤修正或中繼資料。
5. ECC: error correction,某些硬體不僅允許對flash的訪問,也有ecc功能,所有flash器件都受位交換現象的困擾。在某些情況下,一個位元位會發生反轉或被報告反轉了,如果此位真的反轉了,就要採用ECC演算法。
6. erasesize: 一個erase命令可以擦除的最小塊的尺寸
7. buswidth:MTD裝置的介面匯流排寬度
8. interleave:交錯數,幾塊晶片平行串連成一塊晶片,使buswidth變大
9. devicetype:晶片類型,x8、x16或者x32
10.NAND:一種Flash技術,參看NAND和NOR的比較
11.NOR:一種Flash技術,參看NAND和NOR的比較
Linux MTD介紹:
MTD(memory
technology
device記憶體技術裝置)是用於訪問memory裝置(ROM、flash)的Linux的子系統。MTD的主要目的是為了使新的memory裝置的驅
動更加簡單,為此它在硬體和上層之間提供了一個抽象的介面。MTD的所有原始碼在/drivers/mtd子目錄下。我將CFI介面的MTD裝置分為四層
(從裝置節點直到底層硬體驅動),這四層從上到下依次是:裝置節點、MTD裝置層、MTD原始裝置層和硬體驅動層。
根檔案系統
檔案系統
字元裝置節點
MTD字元裝置
MTD塊裝置
MTD原始裝置
FLASH硬體驅動
塊裝置節點
一、
Flash硬體驅動層:硬體驅動層負責在init時驅動Flash硬體,Linux
MTD裝置的NOR Flash晶片驅動遵循CFI介面標準,其驅動程式位於drivers/mtd/chips子目錄下。NAND型Flash的驅動程
序則位於/drivers/mtd/nand子目錄下
二、MTD原始裝置:原始裝置層有兩部分組成,一部分是MTD原始裝置的通用代碼,另一部分是各個特定的Flash的資料,例如分區。
用於描述MTD原始裝置的資料結構是mtd_info,這其中定義了大量的關於MTD的資料和操作函數。mtd_table(mtdcore.c)則是所
有MTD原始裝置的列表,mtd_part(mtd_part.c)是用於表示MTD原始裝置分區的結構,其中包含了mtd_info,因為每一個分區都
是被看成一個MTD原始裝置加在mtd_table中的,mtd_part.mtd_info中的大部分資料都從該分區的主要磁碟分割mtd_part-
>master中獲得。
在drivers/mtd/maps/子目錄下存放的是特定的flash的資料,每一個檔案都描述了一塊板子上的flash。其中調用
add_mtd_device()、del_mtd_device()建立/刪除mtd_info結構並將其加入/刪除mtd_table(或者調用
add_mtd_partition()、del_mtd_partition()(mtdpart.c)建立/刪除mtd_part結構並將
mtd_part.mtd_info加入/刪除mtd_table 中)。
三、MTD裝置層:基於MTD原始裝置,
linux系統可以定義出MTD的塊裝置(主裝置號31)和字元裝置(裝置號90)。MTD字元裝置的定義在mtdchar.c中實現,通過註冊一系列
file operation函數(lseek、open、close、read、write)。MTD塊裝置則是定義了一個描述MTD塊裝置的結構
mtdblk_dev,並聲明了一個名為mtdblks的指標數組,這數組中的每一個mtdblk_dev和mtd_table中的每一個
mtd_info一一對應。
四、裝置節點:通過mknod在/dev子目錄下建立MTD字元裝置節點(主裝置號為90)和MTD塊裝置節點(主裝置號為31),通過訪問此裝置節點即可訪問MTD字元裝置和塊裝置。
五、
根檔案系統:在Bootloader中將JFFS(或JFFS2)的檔案系統映像jffs.image(或jffs2.img)燒到flash的某一個分
區中,在/arch/arm/mach-your/arch.c檔案的your_fixup函數中將該分區作為根檔案系統掛載。
六、檔案系統:核心啟動後,通過mount 命令可以將flash中的其餘分區作為檔案系統掛載到mountpoint上。
裝置層和原始裝置層的函數調用關係(紅色部分需要我們實現):
一
個MTD原始裝置可以通過mtd_part分割成數個MTD原始裝置註冊進mtd_table,mtd_table中的每個MTD原始裝置都可以被註冊成
一個MTD裝置,其中字元裝置的主裝置號為90,次裝置號為0、2、4、6…(奇數次裝置號為唯讀裝置),塊裝置的主裝置號為31,次裝置號為0、1、
2、3…
mtd_notifier mtd_notifier
字元裝置 mtd_fops 塊裝置 mtd_fops
(mtdchar.c) (mtdblock.c) mtdblks
裝置層
register_mtd_user()
get_mtd_device()
unregister_mtd_user()
put_mtd_device()
erase_info
mtd_notifiers
mtd_table
mtd_info
mtd_part
(mtdcore.c)
(mtdpart.c)
Your Flash
(your-flash.c)
add_mtd_partitions()
del_mtd_partitions()
原始裝置層
add_mtd_device()
del_mtd_device()
mtd_partition
NOR型Flash晶片驅動與MTD原始裝置
所有的NOR型Flash的驅動(探測probe)程式都放在drivers/mtd/chips下,一個MTD原始裝置可以由一塊或者數塊相同的
Flash晶片集成。假設由4塊devicetype為x8的Flash,每塊大小為8M,interleave為2,起始地址為0x01000000,
地址相連,則構成一個MTD原始裝置(0x01000000-0x03000000),其中兩塊interleave成一個chip,其地址從
0x01000000到0x02000000,另兩塊interleave成一個chip,其地址從0x02000000到0x03000000。
請注意,所有組成一個MTD原始裝置的Flash晶片必須是同類型的(無論是interleave還是地址相連),在描述MTD原始裝置的資料結構中也只是採用了同一個結構來描述組成它的Flash晶片。
0x03000000
0x02000000
0x01000000
每
個MTD原始裝置都有一個mtd_info結構,其中的priv指標指向一個map_info結構,map_info結構中的fldrv_priv指向一
個cfi_private結構,cfi_private結構的cfiq指標指向一個cfi_ident結構,chips指標指向一個flchip結構的數
組。其中mtd_info、map_info和cfi_private結構用於描述MTD原始裝置;因為組成MTD原始裝置的NOR型Flash相同,
cfi_ident結構用於描述Flash晶片的資訊;而flchip結構用於描述每個Flash晶片的專有資訊(比如說起始地址)
NAND和NOR的比較
NOR和NAND是現在市場上兩種主要的非易失快閃記憶體技術。Intel於1988年首先開發出NOR
flash技術,徹底改變了原先由EPROM和EEPROM一統天下的局面。緊接著,1989年,東芝公司發表了NAND
flash結構,強調降低每位元的成本,更高的效能,並且象磁碟一樣可以通過介面輕鬆升級。但是經過了十多年之後,仍然有相當多的硬體工程師分不清NOR
和NAND快閃記憶體。
相“flash儲存空間”經常可以與相“NOR儲存空間”互換使用。許多業內人士也搞不清楚NAND快閃記憶體技術相對於NOR技術的優越之處,因為大多數情況下快閃記憶體只是用來儲存少量的代碼,這時NOR快閃記憶體更適合一些。而NAND則是高資料存放區密度的理想解決方案。
NOR的特點是晶片內執行(XIP, eXecute In
Place),這樣應用程式可以直接在flash快閃記憶體內運行,不必再把代碼讀到系統RAM中。NOR的傳輸效率很高,在1~4MB的小容量時具有很高的成
本效益,但是很低的寫入和擦除速度大大影響了它的效能。
NAND結構能提供極高的單元密度,可以達到高儲存密度,並且寫入和擦除的速度也很快。應用NAND的困難在於flash的管理和需要特殊的系統介面。
效能比較
flash快閃記憶體是非易失儲存空間,可以對稱為塊的儲存空間單元塊進行擦寫和再編程。任何flash器件的寫入操作只能在空或已擦除的單元內進行,所以大多數
情況下,在進行寫入操作之前必須先執行擦除。NAND器件執行擦除操作是十分簡單的,而NOR則要求在進行擦除前先要將目標塊內所有的位都寫為0。
由於擦除NOR器件時是以64~128KB的塊進行的,執行一個寫入/擦除操作的時間為5s,與此相反,擦除NAND器件是以8~32KB的塊進行的,執行相同的操作最多隻需要4ms。
執行擦除時塊尺寸的不同進一步拉大了NOR和NADN之間的效能差距,統計表明,對於給定的一套寫入操作(尤其是更新小檔案時),更多的擦除操作必須在基於NOR的單元中進行。這樣,當選擇儲存解決方案時,設計師必須權衡以下的各項因素。
● NOR的讀速度比NAND稍快一些。
● NAND的寫入速度比NOR快很多。
● NAND的4ms擦除速度遠比NOR的5s快。
● 大多數寫入操作需要先進行擦除操作。
● NAND的擦除單元更小,相應的擦除電路更少。
介面差別
NOR flash帶有SRAM介面,有足夠的地址引腳來定址,可以很容易地存取其內部的每一個位元組。
NAND器件使用複雜的I/O口來串列地存取資料,各個產品或廠商的方法可能各不相同。8個引腳用來傳送控制、地址和資料資訊。
NAND讀和寫操作採用512位元組的塊,這一點有點像硬碟管理此類操作,很自然地,基於NAND的儲存空間就可以取代硬碟或其他塊裝置。
容量和成本
NAND flash的單元尺寸幾乎是NOR器件的一半,由於生產過程更為簡單,NAND結構可以在給定的模具尺寸內提供更高的容量,也就相應地降低了價格。
NOR flash佔據了容量為1~16MB快閃記憶體市場的大部分,而NAND
flash只是用在8~128MB的產品當中,這也說明NOR主要應用在代碼儲存介質中,NAND適合於資料存放區,NAND在CompactFlash、
Secure Digital、PC Cards和MMC儲存卡市場上所佔份額最大。
可靠性和耐用性
採用flahs介質時一個需要重點考慮的問題是可靠性。對於需要擴充MTBF的系統來說,Flash是非常合適的儲存方案。可以從壽命(耐用性)、位交換和壞塊處理三個方面來比較NOR和NAND的可靠性。
壽命(耐用性)
在NAND快閃記憶體中每個塊的最大擦寫次數是一百萬次,而NOR的擦寫次數是十萬次。NAND儲存空間除了具有10比1的塊擦除周期優勢,典型的NAND塊尺寸要比NOR器件小8倍,每個NAND儲存空間塊在給定的時間內的刪除次數要少一些。
位交換
所有flash器件都受位交換現象的困擾。在某些情況下(很少見,NAND發生的次數要比NOR多),一個位元位會發生反轉或被報告反轉了。
一位的變化可能不很明顯,但是如果發生在一個關鍵檔案上,這個小小的故障可能導致系統停機。如果只是報告有問題,多讀幾次就可能解決了。
當然,如果這個位真的改變了,就必須採用錯誤探測/錯誤更正(EDC/ECC)演算法。位反轉的問題更多見於NAND快閃記憶體,NAND的供應商建議使用NAND快閃記憶體的時候,同時使用EDC/ECC演算法。
這個問題對於用NAND儲存多媒體資訊時倒不是致命的。當然,如果用本機存放區裝置來儲存作業系統、設定檔或其他敏感資訊時,必須使用EDC/ECC系統以確保可靠性。
壞塊處理
NAND器件中的壞塊是隨機分布的。以前也曾有過消除壞塊的努力,但發現成品率太低,代價太高,根本不划算。
NAND器件需要對介質進行初始化掃描以發現壞塊,並將壞塊標記為不可用。在已製成的器件中,如果通過可靠的方法不能進行這項處理,將導致高故障率。
便於使用
可以非常直接地使用基於NOR的快閃記憶體,可以像其他儲存空間那樣串連,並可以在上面直接運行代碼。
由於需要I/O介面,NAND要複雜得多。各種NAND器件的存取方法因廠家而異。
在使用NAND器件時,必須先寫入驅動程式,才能繼續執行其他動作。向NAND器件寫入資訊需要相當的技巧,因為設計師絕不能向壞塊寫入,這就意味著在NAND器件上自始至終都必須進行虛擬映射。
軟體支援
當討論軟體支援的時候,應該區別基本的讀/寫/擦操作和高一級的用於磁碟模擬和快閃記憶體管理演算法的軟體,包括效能最佳化。
在NOR器件上運行代碼不需要任何的軟體支援,在NAND器件上進行同樣操作時,通常需要驅動程式,也就是記憶體技術驅動程式(MTD),NAND和NOR器件在進行寫入和擦除操作時都需要MTD。
使用NOR器件時所需要的MTD要相對少一些,許多廠商都提供用於NOR器件的更進階軟體,這其中包括M-System的TrueFFS驅動,該驅動被
Wind River System、Microsoft、QNX Software System、Symbian和Intel等廠商所採用。
驅動還用於對DiskOnChip產品進行模擬和NAND快閃記憶體的管理,包括錯誤修正、壞塊處理和損耗平衡。
——From M-system公司Arie TAL