MTD(memory technology device記憶體技術裝置)是用於訪問memory裝置(ROM、flash)的Linux的子系統。MTD的主要目的是為了使新的memory裝置的驅 動更加簡單,為此它在硬體和上層之間提供了一個抽象的介面。MTD的所有原始碼在/drivers/mtd子目錄下。我將CFI介面的MTD裝置分為四層 (從裝置節點直到底層硬體驅動),這四層從上到下依次是:裝置節點、MTD裝置層、MTD原始裝置層和硬體驅動層。
一、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上。