前言
會在此文章中看到以下紀錄
- 在工作時有碰到 nand flash 相關問題的處理方式
- 順道了解 nand flash 在 embedded linux platform 的運作方式
- nand flash 的基本知識
以下資料,由些從公司智庫取得,有些是從網路文章、書籍等取得
Nand flash 的基本知識
flash 的種類
在公司主要提到的是 NAND flash 以及 NOR flash
- NOR flash
- Intel 於 1988 年發表
- 支援隨機存取,讀資料的方式跟 RAM 接近,給 address,data 就能讀出
- NOR 的特點是原地執行 (XIP, eXecute In Place),這樣應用程序可以直接在 flash memory 內運行,不必再把資料讀到系統 RAM 中
- 每次寫入 / 擦除都是以 1 block 為單位; 1 block = 16~128 KBytes
- 小容量 (1~4MB) 時具有很高的成本效益,但是很低的寫入和擦除速度大大影響了它的性能
- NOR flash 佔據了容量為 1~16MB 閃存市場的大部分,因隨機存取快,應用在手機中
- NOR的擦寫週期壽命是一萬~十萬次
- 適合用於儲存不需經常更新的程式,例如 BIOS 或韌體
- NAND flash
- Toshiba 於 1989 年發表
- 適用於大容量,更低的寫入和擦除時間,高密度 (單元尺寸是 NOR Flash 的一半),高壽命 (10倍左右),低製造成本
- I/O pin 只有 8 個,只允許連續讀取,所以不適合用於電腦主記憶體 (不支援隨機存取)
- 讀寫操作以 1 page 為單位,擦除 (Erase) 以 1 block 為單位
- 1 block = 32 pages; 每個 block 的單位依照廠商製造的不同有區別,介於 8~32 KBytes 之間
- NAND 擦除單元更小,因此擦除速度 (4ms) 比NOR的 (5s) 快
- 適合於資料儲存,例如:MMC、固態硬碟 (SSD)、USB 3.0 隨身碟、手機、數位相機
- 甚至手機、MP3 撥放器用 NAND Flash 當作存放多媒體檔案的媒介,原因在於成本、空間、還有寫入資料的速度
- NAND 閃存中每個區塊的最大擦寫次數是一百萬次
NAND flash v.s NOR flash
比較項目 | NAND flash | NOR flash |
---|---|---|
讀取速度 | middle | fast |
寫入速度 | fast | slow |
擦除速度 | fast | slow |
容量 | large | small |
成本 | low | high |
市佔率 | upper | lower |
Page and block and related informations
source: http://cmchao.logdown.com/posts/60216
相關專有名詞
- Page
Page 乃 nand flash 讀取時的最小單位 ,目前常見的 page size 為 2k bytes,視產品設計與製程技術等等而定 - Spare
Spare 是每個 page 後面都會接一段額外的容量去儲存此 page 相關的資訊,通常會存 ECC,完成 bit correction 的目的 - OOB (out of boundary)
就是 Spare,我們也比較常用這個說法 - Small page / Large page
大於等於 2k bytes page 就是 large,相對都是 small page - Block
Block 是 寫入時的最小單位 ,理論上是 64 page 為一個 block,依容量也會決定一顆 nand flash 之中會有多少個 block
how to read write
- nand flash 主要都是以 page/block 來當作讀/寫 的最小單位
- 由於物理性質,write 的時候「只能從1寫成0」
- 所以由上述,假設你要寫入一個數值,要從原本的 0 寫成 1,就一定要先 erase block
- erase block 之後再將數值復原
所以平常 write 的動作如下
- read a hole block in to RAM (DDR)
- change RAM data
- erase block
- write data from ram into block (program)
read 就是讀取一個 page,無太多限制
Life cycle
主要分成 Endurance 以及 Retention
- Endurance: Erase block 是一個不可逆的動作,會使得 nand flash 的寫入次數下降,通常為 1k-100k 次
- Retention: 當資料放到 nand 中,可以保證保留資料的時間,一般來說是 10 years
Bad block
就是 chip 之中有可以讀取後,會無法還原成原本數值的 block,會分成:
- factory-bad: 指的是出廠就已經出現問題的 bad block
- worn-out: 即使用多次 erase 後導致的 bad block
ECC / OOB
ECC 就是所謂的 error correction code,每次 read 的時候,都需要透過每個 page 中的 spare (oob) 來進行校正檢查,一般用的檢查有三種
- 漢明碼(Hamming code)
- Reed-Solomon
- Binary BCH8
BBT
BBT 就是 bad block table,之後 bbt 有 scan 到新的 bad block information 都會記在此
Porting and test nand flash on embedded linux platform
U-boot
nand read / nand write
Kernel
Porting drivers
Define nand flash partition (MTD)
https://redmine.internal.ihmi.net/issues/23609
What is MTD?
Related nand flash issues or problems in my work experience
Problem: Get oops while ramdisk while running flash_eraseall
flash_eraseall is a busybox open source code and show at: https://github.com/brgl/busybox/blob/master/miscutils/flash_eraseall.c
1 | [root@freescale root]# ll /usr/bin/flash_eraseall |
Analyze problem
問題點不是system()
而是 flash_eraseall 這支程式
透過 file command 去看這個檔案可以發現1
2file flash_eraseall
flash_eraseall: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.26, not stripped
而之前加上ls可以過是因為
1 | file busybox |
busybox 也是 dynamic link
因此只要之前有 call 到 libc 就可以了
表示如果flash_eraseall有用到其他libary的話還是會出現那個問題
因此在設計時 要非常注意執行檔再切換 ECC 時無論是執行檔還是連結 libary 的位置
Solved skill
- Add related libc to ramdisk.
- Build flash_eraseall binary using static build.