mtd子系統
MTD設備MTD(Memory Technology Device)是內存技術設備,它為原始閃存設備(如NAND、OneNAND、NOR等)提供了一個抽象層。這些不同類型的Flash都可以使用相同的API。
MTD設備不包括MMC、eMMC、SD、CompactFlash等設備。因為這些設備不是原始閃存,但它們內部具有Flash Translation(FTL)層,使它們看起來像塊設備,這些設備屬于Linux塊設備而不是MTD。
mtd子系統接口 MTD字符設備通常稱為/dev/mtd0、/dev/mtd1等。這些字符設備提供對原始閃存的I/O訪問。它們支持許多ioctl調用,用于擦除擦除塊、將其標記為不良或檢查擦除塊是否不良、獲取有關MTD設備的信息等。sysfs接口提供有關系統中每個MTD設備的完整信息。此接口易于擴展,鼓勵開發人員盡可能使用sysfs接口,而不是較舊的ioctl或/proc/mtd接口。mtd子系統的sysfs接口已在內核中進行了說明,當前可在Documentation/ABI/testing/sysfs-class-mtd中找到。/proc/mtd proc文件系統文件提供常規的MTD信息。這是舊版界面,而sysfs界面提供了更多信息。
mtd子系統支持帶有軟件和硬件ECC的 raw NAND閃存、OneNAND閃存、CFI(通用閃存接口)NOR閃存以及其他類型的閃存。
MTD內核API mtd子系統API在include/linux/mtd/mtd.h中定義。此文件中的方法和數據結構被更高層的內核代碼(如Flash文件系統)用來訪問和控制mtd設備,也被設備驅動程序作者用于將其設備注冊到mtd子系統。在mtd_info結構中定義了驅動程序用來訪問設備的各種方法。
代碼語言:JavaScript 代碼運行次數:0
int mtd_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); int mtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); int mtd_erase(struct mtd_info *mtd, struct erase_info *instr); int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs); int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs);
mtd子系統調用關系
mtdblock dirver MTD中提供的mtdblock驅動程序是一種古老的工具,它在MTD設備之上模擬塊設備。它甚至沒有不良的擦除塊處理,因此它實際上不適用于NAND閃存。它的工作方式是將整個閃存擦除塊緩存在RAM中,根據請求對其進行修改,然后擦除整個塊并寫回修改后的內容。這意味著mtdblock不會嘗試進行任何優化,并且在斷電的情況下您將丟失大量數據。最后但并非最不重要的一點是,mtdblock不執行任何耗損均衡或位翻轉處理。
人們通常將mtdblock視為常規FTL層,并嘗試利用mtdblock在raw flash之上使用基于塊的文件系統(yaffs、jffs等)。在大多數情況下,這是錯誤的。換句話說,請不要使用mtdblock,除非您確切地知道自己在做什么。
總結 mtd子系統的作用是提供Flash硬件到用戶層的一個抽象層,用戶可以通過/dev/mtdX直接操作flash器件。/dev/mtdN和/dev/mtdblockN是同一個MTD設備的同一個分區(N一樣)。mtd-utils工具只能應用于/dev/mtdN的MTD字符設備,因為只有MTD字符設備支持ioctl。mount、umount命令只對/dev/mtdblockN的MTD塊設備有效,用于掛載/卸載文件系統。
參考文檔 General MTD documentation