1. 程式人生 > >Linux MTD系統詳解

Linux MTD系統詳解

看到兩篇很不錯的寫MTD的文章,做個記錄,留著備用。原作者分別是lwj103862095zgolee,以下是兩位博主的部落格連結。

lwj103862095:http://blog.csdn.net/lwj103862095/article/details/21545791

zgolee:http://blog.csdn.net/lizhiguo0532/article/details/6007636

MTD,Memory Technology Device即記憶體技術裝置,在Linux核心中,引入MTD層為NOR FLASH和NAND FLASH裝置提供統一介面。MTD將檔案系統與底層FLASH儲存器進行了隔離。


如上圖所示,MTD裝置通常可分為四層,從上到下依次是:裝置節點、MTD裝置層、MTD原始裝置層、硬體驅動層。

Flash硬體驅動層:Flash硬體驅動層負責對Flash硬體的讀、寫和擦除操作。MTD裝置的Nand Flash晶片的驅動則drivers/mtd/nand/子目錄下,Nor Flash晶片驅動位於drivers/mtd/chips/子目錄下。

MTD原始裝置層:用於描述MTD原始裝置的資料結構是mtd_info,它定義了大量的關於MTD的資料和操作函式。其中mtdcore.c:  MTD原始裝置介面相關實現,mtdpart.c :  MTD分割槽介面相關實現。

MTD裝置層:基於MTD原始裝置,linux系統可以定義出MTD的塊裝置(主裝置號31)字元裝置(裝置號90)。其中mtdchar.c :  MTD字元裝置介面相關實現,mtdblock.c : MTD塊裝置介面相關實現。

裝置節點:通過mknod在/dev子目錄下建立MTD塊裝置節點(主裝置號為31)MTD字元裝置節點(主裝置號為90)。通過訪問此裝置節點即可訪問MTD字元裝置和塊裝置 

MTD資料結構:

1.Linux核心使用mtd_info結構體表示MTD原始裝置,這其中定義了大量關於MTD的資料和操作函式(後面將會看到),所有的mtd_info結構體存放在mtd_table結構體資料裡。在/drivers/mtd/mtdcore.c裡:

[cpp] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. struct mtd_info *mtd_table[MAX_MTD_DEVICES];  
2.Linux核心使用mtd_part結構體表示分割槽,其中mtd_info結構體成員用於描述該分割槽,大部分成員由其主分割槽mtd_part->master決定,各種函式也指向主分割槽的相應函式。 [cpp] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. struct mtd_part {  
  2.     struct mtd_info mtd;        /* 分割槽資訊, 大部分由master決定 */
  3.     struct mtd_info *master;    /* 分割槽的主分割槽 */
  4.     uint64_t offset;            /* 分割槽的偏移地址 */
  5.     int index;                  /* 分割槽號 (Linux3.0後不存在該欄位) */
  6.     struct list_head list;      /* 將mtd_part鏈成一個連結串列mtd_partitons */
  7.     int registered;  
  8. };  
mtd_info結構體主要成員,為了便於觀察,將重要的資料放在前面,不大重要的編寫在後面。 [cpp] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. struct mtd_info {  
  2.     u_char type;         /* MTD型別,包括MTD_NORFLASH,MTD_NANDFLASH等(可參考mtd-abi.h) */
  3.     uint32_t flags;      /* MTD屬性標誌,MTD_WRITEABLE,MTD_NO_ERASE等(可參考mtd-abi.h) */
  4.     uint64_t size;       /* mtd裝置的大小 */
  5.     uint32_t erasesize;  /* MTD裝置的擦除單元大小,對於NandFlash來說就是Block的大小 */
  6.     uint32_t writesize;  /* 寫大小, 對於norFlash是位元組,對nandFlash為一頁 */
  7.     uint32_t oobsize;    /* OOB位元組數 */
  8.     uint32_t oobavail;   /* 可用的OOB位元組數 */
  9.     unsigned int erasesize_shift;   /* 預設為0,不重要 */
  10.     unsigned int writesize_shift;   /* 預設為0,不重要 */
  11.     unsigned int erasesize_mask;    /* 預設為1,不重要 */
  12.     unsigned int writesize_mask;    /* 預設為1,不重要 */
  13.     constchar *name;               /* 名字,   不重要*/
  14.     int index;                      /* 索引號,不重要 */
  15.     int numeraseregions;            /* 通常為1 */
  16.     struct mtd_erase_region_info *eraseregions; /* 可變擦除區域 */
  17.     void *priv;     /* 裝置私有資料指標,對於NandFlash來說指nand_chip結構體 */
  18.     struct module *owner;   /* 一般設定為THIS_MODULE */
  19.     /* 擦除函式 */
  20.     int (*erase) (struct mtd_info *mtd, struct erase_info *instr);  
  21.     /* 讀寫flash函式 */
  22.     int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);  
  23.     int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);  
  24.     /* 帶oob讀寫Flash函式 */
  25.     int (*read_oob) (struct mtd_info *mtd, loff_t from,  
  26.              struct mtd_oob_ops *ops);  
  27.     int (*write_oob) (struct mtd_info *mtd, loff_t to,  
  28.              struct mtd_oob_ops *ops);  
  29.     int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);  
  30.     int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);  
  31.     int (*get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);  
  32.     int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);  
  33.     int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);  
  34.     int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len);  
  35.     int (*writev) (struct mtd_info *mtd, conststruct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);  
  36.     int (*panic_write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);  
  37.     /* Sync */
  38.     void (*sync) (struct mtd_info *mtd);  
  39.     /* Chip-supported device locking */
  40.     int (*lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);  
  41.     int (*unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);  
  42.     /* 電源管理函式 */
  43.     int (*suspend) (struct mtd_info *mtd);  
  44.     void (*resume) (struct mtd_info *mtd);  
  45.     /* 壞塊管理函式 */
  46.     int (*block_isbad) (struct mtd_info *mtd, loff_t ofs);  
  47.     int (*block_markbad) (struct mtd_info *mtd, loff_t ofs);  
  48.     void (*unpoint) (struct mtd_info *mtd, loff_t from, size_t len);  
  49.     unsigned long (*get_unmapped_area) (struct mtd_info *mtd,  
  50. 相關推薦

    Linux MTD系統

    看到兩篇很不錯的寫MTD的文章,做個記錄,留著備用。原作者分別是lwj103862095和zgolee,以下是兩位博主的部落格連結。 lwj103862095:http://blog.csdn.net/lwj103862095/article/details/215

    linux檔案系統

    什麼是檔案系統 檔案系統是作業系統用於明確磁碟或分割槽上的檔案的方法和資料結構,即在儲存裝置(磁碟)上組織檔案的方法。作業系統中負責管理和儲存檔案資訊的軟體結構稱為檔案管理系統,簡稱檔案系統。 從系統角度來看,檔案系統是對檔案儲存裝置的空間進行組織和分配,負責檔案儲存並對存入的檔案進行保護和檢索的系統

    (十三)linux檔案系統(基於ext2檔案系統

      我們知道,一個磁碟可以劃分成多個分割槽,每個分割槽必須先用格式化工具(例如某種mkfs命令)格式化成某種格式的檔案系統,然後才能儲存檔案,格式化的過程會在磁碟上寫一些管理儲存佈局的資訊。下圖是一個磁碟分割槽格式化成ext2檔案系統後的儲存佈局:

    linux文件系統

    ide block 數量 程序 擴展 完成 分割 不為 partition 1.linux文件體系:一切皆文件和文件目錄樹的資源管理方式一起構成了linux的文件體系,讓linux操作系統可以方便地使用系統資源 2.硬盤分區:分區本身並不是必須的,我們完全可以把一整塊硬盤當

    第二課:第3講Linux根文件系統

    IV oot test 訪問 自己 偽文件系統 長度 -a .so 第二課:第3講Linux根文件系統詳解1.file 命令及其用法2.ELF:可執行文件的存儲格式,常見的linux可執行二進制文件格式windows :PEliunx:ELF3.文件系統rootfs:根文件

    分散式系統--Linux(許可權)

                              分散式系統詳解--Linux(許可權)         之前再window

    linux目錄結構和根檔案系統

    FHS: /bin:所有使用者可用的基本命令程式檔案; /sbin: 供系統管理使用的工具程式; /boot: 引導載入器必須用到的各靜態檔案:kernel,inintramfs(initrd),

    Linux之nfs檔案系統

    NFS 概念 網路檔案系統 (NFS) 是 Unix 系統和網路附加儲存檔案管理器常用的網路檔案系統 , 允許多個客戶端通過網路共享檔案訪問。它可用於提供對共享二進位制目錄的訪問 , 也可用於允許使用者在同一工作組中從不同客戶端訪問其檔案。 一、nfs

    [轉]Ceph:OpenStack標配&Linux PB級分散式檔案系統

    Ceph:一個 Linux PB 級分散式檔案系統作為一名儲存行業的架構師,我對檔案系統情有獨鍾。這些系統用來儲存系統的使用者介面,雖然它們傾向於提供一系列類似的功能,但它們還能夠提供差異顯著的功能。Ceph 也不例外,它還提供一些您能在檔案系統中找到的最有趣的功能。Ceph

    linux入門--類UNIX系統

    windows 免費 unix 移植 posix upload 維基百科 操作 solaris 有人說,這個世界上只有兩種操作系統: UNIX 和類 UNIX 操作系統; 其它操作系統。 類 UNIX 系統(英文 Unix-like)既包括各種傳統的 UNIX

    Linux啟動流程

    linux 詳解 啟動流程 grub mbr 內核 linux啟動流程第一部分 Linux啟動基礎知識1.1 linux centos6.8啟動流程圖 BIOS加電自檢à加載MBRà加載啟動grubà加載內核à啟動/sbin/i

    萌店系統開發模式系統

    app 上海 好的 供應鏈 實現 即時通訊 消費者 粉絲 統計數據 萌店系統開發(李想.185.6504.8478)O2O的優勢在於把網上和網下的優勢完美結合。通過網購導購機,把互聯網與地面店完美對接,實現互聯網落地。讓消費者在享受線上優惠價格的同時,又可享受線下貼身的服務

    Linux netstat命令,高級面試必備

    bytes tool head osi ngs 進行 pen 通信 詳細信息 簡介 Netstat 命令用於顯示各種網絡相關信息,如網絡連接,路由表,接口狀態 (Interface Statistics),masquerade 連接,多播成員 (Multicast Mem

    linux top 命令

    ctrl+ 一次 所有 使用方法 ase 隱藏 統計 ini 前臺 top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似於Windows的任務管理器。下面詳細介紹它的使用方法。top - 01:06:48 up 1:22, 1 user

    Tomcat日誌系統

    mat core catalina res 最大的 tor dumps 異常 startup 綜合:Tomcat下相關的日誌文件 catalina引擎的日誌文件,文件名:catalina.日期.log Tomcat下內部代碼丟出的日誌,文件名localhost.日期.lo

    【轉】linux awk命令

    column 環境變量 最後一行 工作流程 初始 文本文件 for循環 其中 cti 簡介 awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切

    Linux ls命令

    -c 目錄 輸出 限制 普通 排序 當前 ls -l sna ls 命令可以說是Linux下最常用的命令之一。 -a 列出目錄下的所有文件,包括以 . 開頭的隱含文件。(後有詳解)-b 把文件名中不可輸出的字符用反斜杠加字符編號(就象在c語言裏一樣)的形式列出。-c 輸出

    linux lsof命令

    open 日誌 文件和目錄 delete 數據報 正在 某個文件 alt targe 簡介 lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件

    linux tail 命令

    基本 linux中 file tail命令 方式 sed 缺省 顯示 有效 linux ---tail命令 linux中tail命令---用於查看文件內容 最基本的是cat、more和less。 1. 如果你只想看文件的前5行,可以使用head命令,如: head -5 /

    linux 線程

    大於 linux下 blog 根據 影響 stack 復制代碼 系統資源 代碼 線程 是計算機中獨立運行的最小單位,運行時占用很少的系統資源。可以把線程看成是操作系統分配CPU時間的基本單元。一個進程可以擁有一個至多個線程。它線程在進程內部共享地址空間、打開的文件描述符等資