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