概要
NANDフラッシュ(NAND Flash Memory)は、セルが直列接続(NAND回路的な構成)されたフラッシュメモリです。NORフラッシュと比較して、セル密度が高く大容量・低コストを実現できる一方、バイト単位のランダムアクセスには対応せず、ページ単位での読み書きが必要です。
現代のデータストレージの主役はNANDフラッシュです。スマートフォン・タブレット・SSD・SDカード・USBメモリ・eMMCなど、大容量データを扱うほぼすべてのストレージデバイスにNANDフラッシュが使われています。組み込みLinuxシステムでは、eMMCや生NAND(Raw NAND)でOSイメージ・アプリケーション・ユーザーデータを格納するのが標準的な構成です。
管理の複雑さ(ECC・Bad Block管理・FTL)が課題ですが、Linux MTDサブシステム・UBI・UBIFSといったソフトウェアスタックが整備されており、組み込みLinuxでは比較的容易に扱えます。
歴史・背景
NANDフラッシュは1987年に東芝の舛岡富士雄氏が発明し、1989年に東芝が最初の製品を発売しました。名称はセル構造がNAND論理ゲートに似ていることに由来します。
初期のNANDフラッシュは容量数MB程度でしたが、製造プロセスの微細化が急速に進み、1990年代末にはデジタルカメラ用CompactFlashカード、2000年代にはUSBメモリ・SDカードとして民生機器に大量採用されました。微細化とMLC/TLC/QLCへの多値化によって、価格は急速に下落しました。
2000年代後半から3D NAND(V-NAND)の開発が始まり、2013年にSamsungが世界初の3D V-NANDを製品化。平面セルの微細化限界を打破する技術として現在の主流となっています。Samsungは2023年時点で200層を超える3D NANDを製造しています。
現在はSamsung・SK Hynix・Micron・Kioxia(旧東芝メモリ)・Western Digitalが主要メーカーであり、世界のNAND市場を支配しています。
技術仕様
基本単位
NANDフラッシュはビット→セル→ストリング→ページ→ブロックという階層構造を持ちます:
| 単位 | サイズの目安 | 操作 |
|---|---|---|
| セル | 1〜4ビット | 読み書き最小単位 |
| ページ | 4KB〜16KB(+スペアエリア) | 読み出し・書き込み単位 |
| ブロック | 256KB〜数MB(128〜256ページ) | 消去単位 |
| LUN/Die | 数GB〜数十GB | チップ内の独立単位 |
セル種別と耐久性
| 種別 | ビット数/セル | P/E サイクル | 読み出し速度 | 主な用途 |
|---|---|---|---|---|
| SLC | 1 | 100,000+ | 高速 | 産業・車載 |
| MLC | 2 | 3,000〜10,000 | 中程度 | コンシューマSSD |
| TLC | 3 | 1,000〜3,000 | 低速 | スマホ・大容量SSD |
| QLC | 4 | 100〜1,000 | 低速 | 大容量コールドストレージ |
インターフェース
- Toggle NAND / ONFI (Open NAND Flash Interface): 現代の主流。ONFIはJEDECが標準化。速度はSDR(50MB/s)〜NV-DDR3(400MB/s以上)
- SPI NAND: SPIバスで接続する小型NANDフラッシュ。マイコンからの接続が容易
- eMMC: NAND + コントローラを1パッケージに封入。MMCバスで接続。詳細はeMMCを参照
スペアエリア(OOB: Out-Of-Band)
各ページには主データ領域に加えてスペアエリア(OOBエリア)が存在します。通常64〜256バイトで、Bad Block管理情報・ECCデータ・ファイルシステムメタデータの格納に使います。
動作原理
セル構造
NANDフラッシュのセルはフローティングゲートMOSFETまたはチャージトラップ型(CTF: Charge Trap Flash)です。セルが直列に接続されたストリング構造により、ビット線とセル間の接続数を減らして集積度を高めています。
ビット線(Bit Line)
|
セル(ワード線8)
セル(ワード線7)
セル(ワード線6)
...
セル(ワード線1)
|
選択トランジスタ
|
共通ソース線
読み出し・書き込み・消去
読み出し: ページ単位で行います。対象ワード線に読み出し電圧(Vref)を印加し、他のワード線はパス電圧を印加してセルの閾値電圧(SLCなら1閾値、MLCなら3閾値)を判定します。読み出し時間は約25〜100µsです。
書き込み(プログラム): ページ単位で行います。Fowler-Nordheimトンネリングによりフローティングゲートに電子を注入します。書き込み時間は200µs〜数msです。同一ページへの再書き込みは消去後でないと不可です。
消去: ブロック単位で行います。基板に高電圧を印加してブロック内全セルのフローティングゲートの電子を引き抜きます。消去時間は1〜数msです。
3D NAND(V-NAND)
従来の平面(2D)NANDは微細化の物理的限界に達したため、セルを垂直方向に積層する3D NAND(V-NAND)が主流となっています。128層・176層・200層以上のセルを縦方向に積み重ねることで、平面NANDと比べて数倍の容量密度を実現しています。
用途・ユースケース
組み込みLinuxのルートファイルシステム
Raspberry Pi等のSBCや産業用SBCでは、NANDフラッシュをベースとしたeMMCにLinuxのルートファイルシステムを格納します。パーティション構成例:
eMMC 8GB
├── /dev/mmcblk0boot0 : ブートローダー(U-Boot SPL)
├── /dev/mmcblk0p1 : FAT32 (100MB) - カーネル・DTB
├── /dev/mmcblk0p2 : ext4 (7.5GB) - rootfs
└── /dev/mmcblk0p3 : ext4 (400MB) - ユーザーデータ
Raw NANDの直接使用
コスト重視の組み込みLinux機では、eMMCを使わずNANDチップを直接MPUのNANDコントローラに接続する構成が使われます。LinuxのMTD(Memory Technology Device)サブシステム・UBI(Unsorted Block Images)・UBIFSを使って管理します。
NAND Flash
└─ MTD (raw flash layer)
└─ UBI (ウェアレベリング・Bad Block管理)
└─ UBIFS (ファイルシステム)
SPI NANDフラッシュ
マイコンからSPIでアクセスできるSPI NANDフラッシュ(Winbond W25N・GigaDevice GD5FシリーズなどGB級)は、データロガー・OTAファームウェア格納・設定データ保存に使われます。
// SPI NAND読み出し例(疑似コード)
void spi_nand_read_page(uint16_t page_addr, uint8_t *buf) {
// Step1: Page Data Read to Cache
spi_select();
spi_send_byte(0x13); // Page Read to Cache
spi_send_byte(0x00); // dummy
spi_send_byte(page_addr >> 8);
spi_send_byte(page_addr & 0xFF);
spi_deselect();
spi_nand_wait_ready(); // OIP bit待ち
// Step2: Read from Cache
spi_select();
spi_send_byte(0x03); // Read from Cache
spi_send_byte(0x00); // column MSB
spi_send_byte(0x00); // column LSB
spi_send_byte(0x00); // dummy
spi_recv_bytes(buf, 2048); // 1ページ=2048バイト
spi_deselect();
}
SDカード・USBメモリ
NANDフラッシュに独自コントローラを搭載したSDカード・USBメモリは、組み込みLinuxのデータストレージとして広く使われています。ただし、品質のばらつきが大きく、産業用途には産業グレード品を使うことが重要です。
実装・開発のポイント
ECC(エラー訂正符号)の必須化
NANDフラッシュはNORより誤り率が高く、ECC(Error Correcting Code)が必須です。製品により必要なECC強度が異なります(1ビット/512Bから最大60ビット/1KBまで)。使用するNANDの仕様書でECC要件を必ず確認します。
LinuxのMTD NANDドライバは、ハードウェアECCエンジン(MPU内蔵)またはソフトウェアECC(Hamming/BCH)を使ってECCを自動処理します。
Bad Block管理
NANDフラッシュは出荷時から不良ブロックが存在することがあり(SLC: 最大2%、MLC/TLC: それ以上)、使用中も増加します。スペアエリアのBad Block Marker(先頭バイトが0xFFでない場合は不良)を確認し、不良ブロックをスキップして使う必要があります。
// Bad Block確認の疑似コード
bool is_bad_block(uint32_t block) {
uint8_t spare[64];
nand_read_oob(block * BLOCK_SIZE, spare);
return spare[0] != 0xFF; // 先頭バイトが0xFFでなければBad Block
}
ウェアレベリング
ウェアレベリングを実装しないと、特定ブロックが先に寿命を迎えます。UBI(UBI subsystem)を使えばLinuxカーネルレベルでウェアレベリングが自動的に実施されます。eMMCは内蔵コントローラがウェアレベリングを処理します。
書き込み増幅(Write Amplification)
ファイル更新のたびにブロック全体を消去・再書き込みすると、実際の書き込みデータより多くのフラッシュへの書き込みが発生します(Write Amplification)。FTLやUBIが最適化しますが、ログ構造型ファイルシステム(UBIFS・LittleFS・JFFS2)を使うことで軽減できます。
電源断保護
NAND書き込み中に電源断が発生するとページ・ブロックが壊れる可能性があります。ジャーナリングファイルシステム(ext4 journal、UBIFS)を使い、電源断でも整合性が保たれるようにします。また、書き込みキャッシュのフラッシュ(sync/fsync)タイミングを適切に管理します。
他技術との比較
NANDフラッシュ vs NORフラッシュ
| 項目 | NAND | NOR |
|---|---|---|
| セル密度 | 高い(大容量・安価) | 低い(小容量・高価) |
| ランダム読み出し | 遅い(ページ単位) | 速い(バイト単位・XIP可) |
| 書き込み速度 | 速い(ページ単位) | 遅い(バイト〜ワード単位) |
| 消去単位 | ブロック(大きい) | セクタ(小さい) |
| 耐久性 | NORより低め | 高い(100,000回) |
| 用途 | データストレージ | コード実行・設定格納 |
NANDフラッシュ vs HDD
HDDは機械的可動部を持つため衝撃・振動に弱く、ランダムアクセスが遅いです。NANDフラッシュは固体素子のため振動耐性があり、ランダムアクセスも速く、消費電力も低いです。組み込みシステムでは実質的にHDDは使われず、NANDベースのeMMCやSSDが標準です。
NANDフラッシュ vs SRAM/DRAM
SRAM・DRAMは揮発性で、電源断でデータが消えます。NANDは不揮発でデータを保持しますが、読み書き速度はSRAMより何桁も遅いです。システム起動時にNANDからDRAMにデータをロードし、実行時はDRAMを使うというのが組み込みLinuxシステムの基本構成です。