• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > NAND Flash嵌入式存儲系統結構分析

    NAND Flash嵌入式存儲系統結構分析

    作者: 時間:2011-04-24 來源:網絡 收藏

     目前市場上閃存芯片主要有兩類,即 (Not And ROM)和NOR (Not Or Flash ROM)。前者具有容量大、讀寫速度快、芯片面積小、單元密度高、擦除速度快、成本低等特點,更適合于大批量數據。如今Windows仍是桌面的主流,對FAT文件提供了天然的支持。然而就技術而言,FAT文件系統并不適合Flash,因為Flash設備并不是塊設備[1],為了不破壞兼容性,并在型閃存中應用FAT文件系統,國際上提出了閃存轉譯層FTL(Flash Translation Layer)的解決方案。

    本文引用地址:http://www.czjhyjcfj.com/article/150827.htm

      1 Flash系統

      基于NAND Flash的系統的設計首先要解決壞塊問題。由于NAND Flash自身存在固有壞塊并在擦除和編程中又隨機產生壞塊,因此為了提高設備的可靠性應該將這兩種操作分散在閃存不同的塊中,以避免對某塊的過度操作。

      一般的基于NAND Flash存儲系統驅動分為三個層次:最底層是硬件操作接口,負責將主控芯片與Flash的控制管腳相連,這方面的固件主要實現對NAND Flash的物理操作;中間層是閃存轉譯層NFTL(NAND FTL),是封裝在Flash驅動中的軟件模塊,其作用是將Flash模擬成與磁盤相類似的塊設備,使對上層操作系統而言,NAND Flash就像普通磁盤一樣被訪問。這一層主要是封裝一些特殊的復雜管理控制功能;最上面的層就是文件管理層,功能類似于普通磁盤上的通用文件系統,向上層提供標準的文件操作接口?;贜AND Flash的嵌入式系統存儲原理圖如圖1所示。

      

      根據以上兩個方面,既要在驅動中實現壞塊管理,又要進行塊模擬,所以可用的方法有兩種[2]:一是在上層文件系統中解決壞塊問題,驅動層只實現本身的功能,文件系統為驅動層提供不變的接口,為上層應用程序提供可靠透明的服務。這種方法較簡單,開發周期比較短,但只對特定應用的嵌入式系統有很強的適應性;第二種方法是在驅動層的NFTL中解決壞塊問題,將不可靠的NAND Flash虛擬成可靠的存儲設備,為上層文件系統提供可靠透明服務,這種方法較第一種更復雜,但是此法具有較強的可移植性并能徹底斷絕與文件系統的聯系,其他文件系統也同樣適用。

      本文是以Samsung的NAND Flash K9F2808U0C作為存儲芯片,設計了一種在NFTL上實現壞塊管理并且實現連續數據讀取的方法。

      2 設計思想

      2.1 閃存空間劃分

      K9F2808U0C是16 MB×8 bit的NAND Flash,共有1 024個Block,1 Block=16 KB,32 Page/Block,1 Page=528 B=(512 B+16 B),其中16 B為備用區,主要存放NAND Flash出廠壞塊標記、ECC校驗碼以及用戶自定義區。K9F2808U0C地址空間是24 bit,分三個周期依次送入NAND Flash的地址鎖存器。本文使用的地址均為字節地址,數據類型為DWORD(4 B)。

      將K9F2808U0C的存儲空間劃分為四個區:壞塊映射表存放區、交換塊區、壞塊映射區和實際數據存放區。文件系統管理的空間就是實際的數據存放空間,如圖2所示。

      

      2.2 各分區宏定義

      #define FLASH_BLOCK_SIZE 0x40000 //16 KB/Block

      #define FLASH_PAGE_SIZE 0x200 //512 B/Page

      #define FLASH_SECTOR_SIZE 0x200

      //1Page=1Sector(only K9F2808U0C)

      #define FLASH_BLOCKS_TABLE 3//壞塊映射表存放塊數

      #define FLASH_SWAP_BLOCKS 5 //交換區的塊數

      #define FLASH_BAD_BLOCKS_REMAP 50

      //壞簇重映區的塊數

      #define FLASH_MAX_ADDR 0xFFFFFF

      //Flash最大字節地址

      各分區首地址計算公式:

      FLASH_BLOCK_TABLE_ADDR=FLASH_MAX_ADDR+

      1-3*FLASH_BLOCK_SIZE);

      FLASH_SWAP_BLOCK_ADDR=(FLASH_BLOCK_

      TABLE_ADDR-5*FLASH_BLOCK_SIZE);

      FLASH_BAD_BLOCK_REMAP_ADDR=(FLASH_SWAP_

      BLOCK_ADDR-50*FLASH_BLOCK_SIZE);

      FLASH_MAX_SECTOR_ADDR=(FLASH_MAX_ADDR-

      3*FLASH_BLOCK_TABLE_ADDR-5*FLASH_SWAP_

      BLOCK_ADDR-50*FLASH_BAD_BLOCK_REMAP_ADDR);

      文件系統管理的最大字節地址。

    linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

    上一頁 1 2 3 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 肥城市| 大同市| 叙永县| 车险| 常德市| 西城区| 尉氏县| 安康市| 兴国县| 安远县| 驻马店市| 兴业县| 清水县| 宝坻区| 武定县| 古田县| 灵寿县| 平度市| 墨江| 隆林| 长岛县| 沂源县| 南充市| 潜山县| 文水县| 宜兴市| 江陵县| 尼勒克县| 滨州市| 黑河市| 墨江| 修文县| 托里县| 新龙县| 宝应县| 海南省| 昆明市| 合川市| 永春县| 建平县| 鹤峰县|