Các loại bộ nhớ: NOR, NAND, Flash, eMMC¶
Trong embedded Linux, bộ nhớ không mất dữ liệu (non-volatile) dùng để chứa bootloader, kernel, rootfs và dữ liệu ứng dụng. Chọn loại nào ảnh hưởng đến dung lượng, tốc độ, độ bền, chi phí và cả cách Linux truy cập (MTD hay block device).
Flash là gì¶
Flash là họ bộ nhớ bán dẫn xóa và ghi lại được bằng điện, cấu tạo từ các ô nhớ floating-gate. Hai kiến trúc chính là NOR và NAND, đặt tên theo cách nối các ô nhớ (giống cổng NOR / NAND).
Đặc điểm chung của mọi loại flash:
- Ghi bit
1 → 0theo từng byte/page, nhưng muốn0 → 1phải xóa cả một erase block (vài chục KB đến vài MB). - Số chu kỳ xóa/ghi (P/E cycles) có giới hạn, nên cần wear leveling.
- Không ghi đè trực tiếp (in-place) như RAM hay EEPROM.
NOR Flash¶
- Truy cập ngẫu nhiên theo byte, đọc nhanh. Cho phép XIP (execute in place): CPU chạy code thẳng từ flash, không cần chép vào DRAM.
- Ghi và xóa chậm; chi phí trên mỗi bit cao nên dung lượng thường chỉ từ vài MB đến vài trăm MB.
- Độ tin cậy cao: ít bit lỗi, thường không cần ECC, hiếm bad block, endurance khoảng 100K chu kỳ.
- Giao tiếp: parallel (CFI) hoặc SPI / QSPI / OSPI (phổ biến nhất hiện nay).
- Dùng cho: bootloader (SPL, U-Boot), firmware nhỏ, cấu hình. Với Zynq thì là QSPI chứa
BOOT.BIN.
NAND Flash¶
- Truy cập theo page (2–16 KB) và xóa theo block (128 KB–vài MB). Không XIP được.
- Dung lượng lớn, giá mỗi bit thấp, ghi/xóa nhanh hơn NOR.
- Có bad block ngay từ nhà máy và phát sinh thêm trong quá trình dùng, bắt buộc phải có ECC (BCH, LDPC) và bad block management.
- Mỗi cell có thể lưu 1 đến 4 bit (SLC, MLC, TLC, QLC); càng nhiều bit thì rẻ hơn nhưng kém bền hơn. Xem SLC, MLC, TLC, QLC.
- Hai cách dùng:
- Raw NAND: SoC trực tiếp điều khiển qua NAND controller (parallel, hoặc SPI NAND). Phần mềm phải tự lo ECC, bad block, wear leveling.
- Managed NAND: NAND đi kèm controller bên trong, che giấu các việc trên (xem eMMC bên dưới).
eMMC¶
eMMC (embedded MultiMediaCard) là chip NAND + controller (FTL, Flash Translation Layer) đóng gói chung (BGA), giao tiếp qua bus MMC (1/4/8 bit data, HS200/HS400).
- Controller lo ECC, bad block, wear leveling, nên với Linux nó là một block device thông thường (
/dev/mmcblk0). - Có thể dùng filesystem thường như ext4, f2fs mà không cần MTD hay UBI.
- Có sẵn boot partition (
mmcblk0boot0/1), RPMB (vùng lưu dữ liệu xác thực chống replay, dùng cho secure boot / TrustZone) và vùng GP/enhanced (cấu hình SLC mode). - Cùng họ managed NAND còn có SD card, UFS và SSD.
Công nghệ chi tiết¶
Cell nhớ floating-gate¶
Cell flash là một MOSFET có thêm floating gate (cổng nổi) cô lập hoàn toàn bằng oxide, nằm giữa control gate và kênh dẫn. Điện tích (electron) bị giữ trong floating gate làm thay đổi điện áp ngưỡng Vth của transistor:
- Có electron → Vth cao → cell không dẫn ở điện áp đọc chuẩn → đọc là
0(programmed). - Không có electron → Vth thấp → cell dẫn → đọc là
1(erased).
Dữ liệu được giữ vì electron bị oxide nhốt (retention nhiều năm), nhưng mỗi lần nạp/xóa làm oxide hao mòn dần. Đây là nguồn gốc của giới hạn P/E cycles.
Một số hãng dùng charge trap (lớp SiN thay cho floating gate dẫn điện) để lưu điện tích. Cách này ít nhạy với lỗi oxide cục bộ và là nền tảng của 3D NAND.
Cơ chế ghi và xóa¶
| Thao tác | NOR | NAND |
|---|---|---|
Program (ghi 0) |
Channel Hot Electron (CHE) injection: dòng lớn, nhanh theo byte nhưng tốn điện | Fowler-Nordheim (FN) tunneling: điện áp cao (~20 V), dòng nhỏ, ghi song song cả page |
Erase (về 1) |
FN tunneling, cả sector | FN tunneling, cả block |
| Read | Đặt điện áp lên word line, đo dòng của từng cell | Các cell khác trong string được bật (pass voltage), chỉ cell cần đọc bị so với ngưỡng |
Vì cần điện áp cao, chip có sẵn charge pump bên trong để tạo từ nguồn 1.8/3.3 V.
Kiến trúc mảng NOR và NAND¶
- NOR: mỗi cell nối trực tiếp với bit line và đất, nên truy cập ngẫu nhiên được và đọc nhanh. Đổi lại phải có contact cho từng cell, tốn diện tích, dung lượng khó lớn.
- NAND: 32–128+ cell nối tiếp thành một string với chỉ hai contact (SSL, GSL), diện tích mỗi cell nhỏ hơn nhiều. Vì vậy mật độ cao và giá rẻ, nhưng chỉ truy cập theo page. Đồng thời cell bị đọc/ghi sẽ ảnh hưởng cell lân cận trong string.
Một chip NAND được chia thành nhiều cấp: die → plane → block → page. Đọc/ghi theo page, xóa theo block, và vùng OOB (spare) đi kèm mỗi page chứa ECC và metadata.
SLC, MLC, TLC, QLC¶
Cell không chỉ phân biệt "có / không có điện tích" mà có thể giữ nhiều mức điện tích (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 | Độ bền (P/E) | 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/đọc chậm hơn và chịu được ít chu kỳ xóa/ghi hơn, đổi lại cùng diện tích lưu được nhiều bit hơn nên rẻ hơn. Thiết bị công nghiệp ghi nhiều thường chọn SLC, còn thiết bị tiêu dùng chủ yếu đọc thì chọn TLC.
pSLC là cách dùng chip TLC/MLC chỉ với 2 mức như SLC: mất bớt dung lượng nhưng được độ bền và tốc độ gần SLC. eMMC công nghiệp hay dùng cho boot partition và vùng enhanced.
3D NAND¶
Khi cell planar (2D) không thu nhỏ thêm được vì nhiễu giữa các cell, NAND chuyển sang xếp chồng theo chiều dọc (V-NAND, BiCS): string dựng thẳng đứng, word line là các lớp phẳng chồng lên nhau, hiện đã trên 200 lớp. Cell có thể dùng kích thước lớn hơn nên endurance và retention tốt hơn 2D ở cùng mật độ. Hầu hết các NAND/eMMC đời mới đều là 3D, dùng charge trap.
Các hiện tượng gây lỗi cần biết¶
- Read disturb: đọc nhiều lần một block làm các cell lân cận bị lệch Vth. Cần đọc lại và refresh block.
- Program disturb: ghi một page ảnh hưởng page kế bên cùng string.
- Data retention: điện tích rò dần theo thời gian và nhiệt độ; càng hao mòn thì giữ được càng ngắn (và TLC/QLC kém hơn SLC).
- Bad block: block hỏng ban đầu hoặc phát sinh khi program/erase fail. Raw NAND phải đánh dấu trong spare area (OOB) và bỏ qua.
EEPROM¶
Cell EEPROM cũng dùng FN tunneling nhưng mỗi ô có thêm select transistor riêng, nên xóa và ghi được theo từng byte. Đổi lại cell lớn, dung lượng nhỏ và giá cao. Ngược lại, flash bỏ select transistor, đổi tính linh hoạt lấy mật độ.
eMMC bên trong¶
eMMC là một package gồm hai thành phần: các die 3D NAND và một controller xử lý:
- FTL (Flash Translation Layer): ánh xạ địa chỉ logic (LBA) sang vị trí vật lý (block/page). Mỗi lần ghi thường đi tới page mới, bảng ánh xạ cập nhật theo.
- Wear leveling: dàn đều số lần xóa giữa các block, cả dữ liệu tĩnh lẫn động.
- Garbage collection: gom các page còn hợp lệ ra khỏi block có nhiều page cũ, rồi xóa block đó để tái sử dụng. Đây là lý do tốc độ ghi có thể tụt đột ngột khi eMMC gần đầy.
- ECC, bad block management, over-provisioning: dự trữ phần dung lượng không công bố để làm vùng đệm và thay thế block hỏng.
- Bộ đệm SLC (pSLC cache): ghi tạm vào vùng chế độ SLC cho nhanh, sau đó gộp xuống TLC.
- Power-loss protection ở mức firmware: một số dòng eMMC công nghiệp có, nhưng nhiều dòng tiêu dùng không đảm bảo. Hãy xem datasheet.
Điều này giải thích vì sao eMMC "dễ dùng" hơn raw NAND, nhưng chất lượng firmware controller của hãng (Micron, Samsung, Kioxia, SanDisk...) ảnh hưởng lớn đến độ tin cậy mà phần mềm không kiểm soát được.
So sánh¶
| Tiêu chí | EEPROM | NOR | Raw NAND | eMMC |
|---|---|---|---|---|
| Dung lượng điển hình | Kb–Mb | 1 MB–1 GB | 128 MB–vài GB | 4 GB–512 GB |
| Đơn vị đọc | Byte | Byte | Page | Block 512 B |
| Đơn vị ghi | Byte/page nhỏ | Byte/page | Page | Block |
| Đơn vị xóa | Byte | Sector 4–64 KB | Block 128 KB+ | Ẩn (controller lo) |
| XIP | Không | Có | Không | Không |
| Tốc độ đọc | Chậm | Nhanh | Trung bình | Nhanh |
| Tốc độ ghi | Chậm | Chậm | Nhanh | Nhanh |
| ECC / bad block | Không | Hầu như không | Cần (phần mềm) | Controller tự lo |
| Giá/bit | Rất cao | Cao | Thấp | Thấp |
| Linux subsystem | at24, nvmem |
MTD (spi-nor) |
MTD + UBI | MMC / block |
| Filesystem điển hình | Không | JFFS2, UBIFS, squashfs | UBIFS | ext4, f2fs |
| Dùng cho | Config, MAC | Bootloader | Rootfs, data | Rootfs, data |
Linux xử lý thế nào¶
NOR / raw NAND / SPI-NOR ──► MTD (/dev/mtdN) ──► UBI ──► UBIFS
└──► JFFS2, squashfs (mtdblock)
eMMC / SD ──► MMC subsystem ──► block device (/dev/mmcblkN) ──► ext4 / f2fs
- MTD (Memory Technology Device) trừu tượng hóa flash thô: đọc, ghi, xóa theo erase block. Xem phân vùng bằng
cat /proc/mtdhoặcmtdinfo. - UBI nằm trên MTD, làm wear leveling và bad block management cho raw NAND; UBIFS chạy trên UBI.
- Với eMMC, các việc này đã nằm trong controller nên không cần MTD/UBI.
cat /proc/mtd # danh sách phân vùng MTD
mtd_debug info /dev/mtd0 # thông tin chip
flash_erase /dev/mtd2 0 0 # xóa cả phân vùng
nandwrite -p /dev/mtd2 rootfs.img
lsblk /dev/mmcblk0 # eMMC
mmc extcsd read /dev/mmcblk0 # đọc EXT_CSD (mmc-utils)
Chọn loại nào¶
- Chỉ cần chứa bootloader: NOR (QSPI) vài chục MB là đủ.
- Cần rootfs lớn, tiết kiệm chi phí, đội ngũ chấp nhận quản lý UBI: raw NAND / SPI NAND.
- Muốn đơn giản, tốc độ cao, dung lượng lớn: eMMC. Đây là lựa chọn mặc định cho thiết kế mới.
- Combo thường gặp: NOR/QSPI cho bootloader + eMMC cho rootfs.
Lưu ý khi thiết kế
Với eMMC/NAND, cần dự trù wear khi ghi log liên tục (ghi vào tmpfs hoặc dùng log rotation). Đồng thời nên dùng filesystem phù hợp (UBIFS cho raw NAND, f2fs/ext4 cho eMMC) và đừng bỏ qua việc bật discard/fstrim hoặc cấu hình chế độ SLC cho vùng quan trọng.
Liên kết¶
- EEPROM
- Bootloader Overview: boot từ QSPI/NAND/eMMC
- U-Boot: lệnh
sf,nand,mmc