Flash: NOR, NAND và eMMC¶
Flash là bộ nhớ không mất dữ liệu (non-volatile) phổ biến nhất hiện nay: chứa firmware và bootloader, rootfs của hệ nhúng, và là thành phần lưu trữ bên trong eMMC, thẻ SD, UFS và SSD. Trang này trình bày flash từ dưới lên: cell (đơn vị lưu trữ nhỏ nhất), kiến trúc mảng cell NOR và NAND, tổ chức và lỗi của NAND, và cuối cùng là eMMC, dạng NAND đóng gói kèm controller.
Cell: đơn vị lưu trữ của flash¶
Flash lưu dữ liệu trong các cell, mỗi cell là một transistor có cấu tạo riêng. Các đặc điểm của flash ở những mục sau (xóa theo block, giới hạn số lần ghi, NOR khác NAND, SLC/MLC/TLC) đều bắt nguồn từ cấu tạo và cách ghi/xóa của cell.
Cấu tạo cell¶
Cell là một MOSFET có thêm lớp floating gate nằm giữa control gate và kênh dẫn, được bọc kín bởi lớp cách điện oxide. Electron đưa vào floating gate bị oxide giữ lại kể cả khi mất nguồn, và làm thay đổi điện áp ngưỡng Vth (điện áp cần đặt lên control gate để transistor dẫn):
- Không có electron → Vth thấp → cell dẫn khi đọc → giá trị
1(trạng thái erased). - Có electron → Vth cao → cell không dẫn khi đọc → giá trị
0(trạng thái programmed).
Khi đọc, một điện áp nằm giữa hai mức Vth được đặt lên control gate, và trạng thái dẫn hay không dẫn của cell cho biết giá trị đang lưu.
Ghi và xóa¶
- Ghi (program): đặt điện áp cao (khoảng 10–20 V) để đẩy electron xuyên qua lớp oxide mỏng (tunnel oxide) vào floating gate, chuyển cell từ
1sang0. Thao tác ghi thực hiện được trên từng cell riêng lẻ. - Xóa (erase): đặt điện áp ngược chiều để kéo electron ra, đưa cell về
1. Để tiết kiệm diện tích, nhiều cell nằm chung một vùng đế và điện áp xóa đặt lên cả vùng đó, nên chỉ xóa được cả nhóm cell cùng lúc. Nhóm này gọi là block (NOR thường gọi là sector). - Điện áp cao được tạo ngay trong chip bằng charge pump từ nguồn 1.8/3.3 V.
EEPROM, tiền thân của flash, có thêm một select transistor cho mỗi cell nên xóa được từng byte, nhưng kích thước cell lớn và chi phí cao. Flash loại bỏ transistor này để tăng mật độ, đổi lại phải xóa theo block.
Hệ quả của cơ chế ghi và xóa¶
| Đặc điểm của flash | Nguyên nhân |
|---|---|
Khi ghi chỉ chuyển được 1 → 0; muốn 0 → 1 phải xóa cả block |
Ghi từng cell, nhưng xóa cả block |
| Không ghi đè tại chỗ: sửa dữ liệu phải ghi sang chỗ trống, hoặc xóa block rồi ghi lại | Hệ quả của dòng trên |
| Số lần ghi/xóa có giới hạn (độ bền, tính bằng số chu kỳ program/erase, gọi tắt là P/E cycles) | Mỗi lần electron xuyên qua tunnel oxide làm oxide hao mòn dần |
| Cần wear leveling: dàn đều số lần xóa trên các block để không block nào hỏng sớm | Hệ quả của độ bền có giới hạn |
| Giữ dữ liệu nhiều năm khi không có nguồn (retention), nhưng kém dần khi cell đã hao mòn | Electron bị oxide giữ lại; oxide hao thì điện tích rò dần |
| Ghi và xóa chậm hơn đọc nhiều | Cần điện áp cao và thời gian để electron xuyên qua oxide |
Kiến trúc mảng cell: NOR và NAND¶
Trong chip, các cell xếp thành ma trận. Mỗi hàng nối control gate của các cell vào một word line để chọn cell; mỗi cột có một bit line để đọc dòng điện qua cell. Có hai cách nối cell vào bit line, và tên NOR, NAND đến từ hai cách này:
- NOR: mỗi cell nối song song giữa bit line và đất. Chỉ cần một cell dẫn là bit line bị kéo xuống mức thấp, giống hành vi của cổng logic NOR. Vì mỗi cell nối thẳng ra bit line nên đọc được ngẫu nhiên từng byte, đủ nhanh để CPU chạy code trực tiếp từ flash (XIP, execute in place). Tuy nhiên, mỗi cell cần một điểm tiếp xúc (contact) riêng nên chiếm nhiều diện tích.
- NAND: 32–128+ cell nối nối tiếp thành một chuỗi (string); chỉ hai đầu chuỗi có transistor chọn (SSL phía bit line, GSL phía đất). Bit line chỉ bị kéo xuống khi mọi cell trong chuỗi cùng dẫn, giống cổng logic NAND. Nhờ số contact ít, cell có kích thước nhỏ, mật độ cao và giá thành thấp. Tuy nhiên, để đọc một cell cần bật toàn bộ các cell còn lại trong chuỗi, vì vậy NAND đọc và ghi theo page (nhóm cell cùng một word line) và không hỗ trợ đọc ngẫu nhiên từng byte.
| NOR | NAND | |
|---|---|---|
| Cách nối cell | Song song | Nối tiếp (string) |
| Đọc | Ngẫu nhiên từng byte, có XIP | Theo page |
| Mật độ / giá/bit | Mật độ thấp, giá/bit cao | Mật độ cao, giá/bit thấp |
| Dùng chủ yếu để chứa | Code (bootloader, firmware) | Dữ liệu (rootfs, file) |
NOR Flash¶
- Đọc ngẫu nhiên nhanh, hỗ trợ XIP.
- Ghi chậm và tiêu thụ điện năng lớn: NOR ghi bằng cơ chế channel hot electron (CHE) với dòng điện lớn, theo từng byte hoặc word. Xóa theo sector 4–64 KB, thời gian mỗi lần xóa có thể lên tới hàng trăm ms.
- Dung lượng từ vài MB đến khoảng 1 GB, giá/bit cao.
- Kích thước cell lớn nên tỉ lệ lỗi bit thấp: thường không cần mã sửa lỗi, hầu như không có block hỏng, độ bền khoảng 100K P/E cycles.
- Giao tiếp: parallel (CFI), hoặc phổ biến hơn là SPI / QSPI / OSPI.
- Dùng cho: bootloader (SPL, U-Boot), firmware nhỏ, cấu hình. Ví dụ Zynq boot từ QSPI flash chứa
BOOT.BIN.
NAND Flash¶
NAND ghi bằng cơ chế Fowler-Nordheim (FN) tunneling: dòng điện rất nhỏ cho phép ghi song song cả page, vì vậy tốc độ ghi và xóa cao hơn NOR nhiều. Cell nhỏ và nằm sát nhau giúp NAND có giá thành thấp và dung lượng lớn, nhưng cũng làm phát sinh lỗi bit (trình bày ở các mục dưới).
Tổ chức chip NAND¶
Một chip NAND chia theo cấp die → plane → block → page:
- Page (2–16 KB): đơn vị đọc và ghi. Mỗi page có thêm một vùng nhỏ gọi là OOB (out-of-band, hay spare) để chứa mã sửa lỗi và metadata.
- Block (64–256+ page, tức 128 KB đến vài MB): đơn vị xóa. Trong một block, các page phải được ghi theo thứ tự.
- Plane và die: các nhóm block có thể hoạt động song song để tăng tốc độ.
Lỗi bit, ECC và bad block¶
Vì cell nhỏ và nằm sát nhau, dữ liệu trên NAND có thể bị sai lệch do:
- Read disturb: đọc nhiều lần một block làm Vth của các cell lân cận lệch dần.
- Program disturb: ghi một page ảnh hưởng tới các page bên cạnh trong cùng string.
- Suy giảm retention: cell càng hao mòn thì điện tích càng rò nhanh, nhất là ở nhiệt độ cao.
Do đó NAND luôn cần ECC (error-correcting code, mã sửa lỗi; thường là BCH hoặc LDPC), lưu trong vùng OOB, để phát hiện và sửa bit lỗi khi đọc. Ngoài ra chip có sẵn một số bad block (block hỏng) từ nhà máy và phát sinh thêm trong quá trình dùng; phần mềm hoặc controller phải đánh dấu và bỏ qua chúng (bad block management).
SLC, MLC, TLC, QLC¶
Thay vì chỉ hai trạng thái có và không có điện tích, một cell có thể lưu nhiều mức điện tích, tức nhiều mức Vth, mỗi mức ứng với một tổ hợp bit. Lưu n bit cần 2^n mức. SLC, MLC, TLC, QLC khác nhau ở n:
| Loại | Bit/cell | Số mức Vth | Độ bền (P/E cycles) | Tốc độ | Giá/bit |
|---|---|---|---|---|---|
| SLC | 1 | 2 | ~50K–100K | Nhanh nhất | Cao nhất |
| MLC | 2 | 4 | ~3K–10K | ↓ | ↓ |
| TLC | 3 | 8 | ~1K–3K | ↓ | ↓ |
| QLC | 4 | 16 | ~100–1K | Chậm nhất | Thấp nhất |
Dải Vth là cố định nên thêm bit thì các mức sát nhau hơn. Hệ quả là lỗi bit nhiều hơn (cần ECC mạnh hơn), ghi và đọc chậm hơn, độ bền thấp hơn; đổi lại cùng diện tích lưu được nhiều bit hơn nên giá thành thấp hơn. SLC thường được dùng trong thiết bị công nghiệp có tần suất ghi cao; TLC phổ biến ở thiết bị tiêu dùng, nơi thao tác đọc chiếm ưu thế.
pSLC (pseudo-SLC) là cách dùng chip TLC/MLC chỉ với 2 mức như SLC: dung lượng khả dụng giảm, nhưng độ bền và tốc độ đạt gần mức của SLC.
3D NAND¶
Khi không thể thu nhỏ cell trên mặt phẳng (2D) thêm nữa vì nhiễu giữa các cell, NAND chuyển sang xếp chồng cell theo chiều dọc (V-NAND, BiCS): string dựng đứng, các word line là các lớp chồng lên nhau, hiện đã trên 200 lớp. 3D NAND thường thay floating gate bằng charge trap (lớp SiN giữ điện tích), ít nhạy với khuyết tật oxide cục bộ hơn. Vì không phải thu nhỏ cell, 3D NAND có độ bền và retention tốt hơn NAND 2D cùng mật độ. Hầu hết NAND và eMMC đời mới là 3D.
Raw NAND và managed NAND¶
ECC, bad block management và wear leveling là những việc bắt buộc với NAND. Tùy theo thành phần đảm nhận các chức năng này, NAND được chia thành hai dạng:
- Raw NAND (parallel NAND hoặc SPI NAND): SoC điều khiển chip trực tiếp qua NAND controller; phần mềm (driver, UBI) đảm nhận các chức năng trên.
- Managed NAND: NAND được đóng gói chung với một controller riêng thực hiện các chức năng này; host chỉ làm việc với một thiết bị lưu trữ đơn giản. eMMC, SD card, UFS và SSD đều thuộc dạng này.
eMMC¶
eMMC (embedded MultiMediaCard) là managed NAND dạng chip BGA hàn trên board: gồm các die NAND (thường là 3D TLC) và một controller trong cùng package, giao tiếp với SoC qua bus MMC (1/4/8 bit dữ liệu, chế độ HS200/HS400).
Controller đảm nhận:
- FTL (Flash Translation Layer): ánh xạ địa chỉ logic mà host dùng (theo sector 512 B) sang page vật lý. Khi host ghi đè, FTL ghi dữ liệu mới sang page trống rồi cập nhật bảng ánh xạ, nhờ đó host không cần xử lý quy tắc xóa theo block. SSD dùng cùng cơ chế, xem FTL.
- Garbage collection: gom các page còn hợp lệ ra khỏi block chứa nhiều page cũ, rồi xóa block đó để dùng lại. Quá trình này khiến tốc độ ghi có thể giảm khi eMMC gần đầy.
- Wear leveling, ECC và bad block management.
- Over-provisioning: giữ lại một phần dung lượng không công bố để làm vùng đệm và thay thế block hỏng.
- pSLC cache: ghi tạm vào một vùng chạy chế độ pSLC để tăng tốc độ, sau đó chuyển dữ liệu sang vùng TLC.
Với host, eMMC là một block device thông thường (trên Linux là /dev/mmcblk0, xem Flash Storage (MTD, MMC)). Ngoài vùng dữ liệu chính (user area), eMMC còn có các vùng riêng:
- Boot partition (2 vùng, trên Linux là
mmcblk0boot0/1): chứa bootloader. - RPMB (Replay Protected Memory Block): vùng ghi có xác thực, chống ghi lại dữ liệu cũ, dùng cho secure boot và TrustZone.
- GP / enhanced partition: có thể cấu hình chạy chế độ pSLC cho dữ liệu quan trọng.
Độ tin cậy của eMMC phụ thuộc nhiều vào firmware controller của từng hãng (Micron, Samsung, Kioxia, SanDisk...), phần mềm không kiểm soát được. Khả năng chống mất điện (power-loss protection) có ở một số dòng công nghiệp, nhiều dòng tiêu dùng không đảm bảo; cần tham khảo datasheet.
Liên quan¶
- Storage: HDD và SSD: SSD là managed NAND dung lượng lớn; FTL, TRIM, write amplification và giao tiếp SATA/NVMe.
- Memory Hierarchy: vị trí của flash trong phân cấp bộ nhớ.
- Chọn bộ nhớ non-volatile cho hệ nhúng: so sánh EEPROM, NOR, raw NAND, eMMC và cách chọn cho board.
- Flash Storage (MTD, MMC): cách Linux kernel truy cập flash.
- EEPROM: tiền thân của flash, ghi xóa theo byte.