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上。
摘自jim zeus的《linux mtd源**分析》
嵌入式,ARM掃盲
炮製了一篇,基本是拿來主義,不算技術,只能算雜談。注 此處正常模式和普通模式是我生造的術語,沒有確定是否存在,各位請暫且忽略。arm異常處理過程 arm的異常,包括復位 未定義指令 軟體中斷 資料訪問中止 外部中斷請求 快 速中斷請求。處理過程 1 儲存現場,包括處理器當前狀態 中斷遮蔽位 cpsr...
ARM嵌入式實驗
問題 在startup.s中增加函式,由c程式呼叫,以此取得彙編中相關引數的設定值。獲取pll中m,p值,c程式呼叫彙編函式 在c語言中,要extern 乙個函式宣告即可,然後這個函式在彙編裡面實現。在彙編裡面,用export 把c語言定義的函式名引進來,再開始編寫函式名開始的段 實現 c程式呼叫 ...
嵌入式arm開發學習
今天是學習arm的第二天.感覺又懂了一點.記錄下來,以便以後不時之需.今天先是看了一些linux應用開發的東西,由於之前自己對linux程式設計還算是有過了解,這部分看得很快,基本沒有什麼閱讀障礙.個人建議想學嵌入式linux的人,最好先把unix環境高階程式設計看一遍.你會發現一切都會順其自然.之...