概要
eMMC(embedded Multi Media Card)は、NANDフラッシュメモリとフラッシュコントローラを1つのBGAパッケージに封入した、基板実装型のストレージデバイスです。JEDEC規格(JESD84)で標準化されており、MMC(Multi Media Card)バスプロトコルを使ってSoC・MPUと通信します。
組み込みLinuxシステムの標準ストレージとして広く使われており、Raspberry Pi・NVIDIA Jetson・各種産業用SBC・スマートフォン基板など、OSを必要とする組み込み機器のほぼすべてに搭載されています。容量は4GB〜128GB程度が一般的で、ブートローダー(U-Boot等)・Linuxカーネル・ルートファイルシステム・アプリケーション・ユーザーデータを格納します。
eMMCの最大の特徴は、内蔵コントローラがウェアレベリング・ECC・Bad Block管理・ガベージコレクションをすべて自動処理することです。これにより、ホストシステム(SoC側)は生NAND(Raw NAND)の複雑な管理を意識せずにブロックデバイスとして扱えます。
歴史・背景
eMMCはMMC(Multi Media Card)規格を基盤とし、携帯電話・組み込み機器向けに内蔵型として発展しました。MMC規格はSanDiskとSiemensが1997年に開発し、その後JEDECが標準化を担っています。
2000年代前半、携帯電話の内蔵ストレージとしてNANDフラッシュが普及し始め、コントローラとNANDを一体化したeMMCが登場しました。当初はeMMC 4.3〜4.4規格(最大52MB/s)が主流でした。
2011年にeMMC 5.0が策定され、HS200モード(200MB/s)をサポート。2015年のeMMC 5.1ではHS400モード(400MB/s)に対応し、高性能化が進みました。
スマートフォン市場では2010年代後半にUFS(Universal Flash Storage)が普及し始め、eMMCからUFSへの移行が進んでいますが、組み込み産業用途ではeMMCの実績と互換性から引き続き主流です。2020年代現在、Western Digital(SanDisk)・Micron・SK Hynix・Samsung・Kioxiaが主要サプライヤです。
産業用途ではSLC NANDを使った産業グレードeMMC(Swissbit・Greenliant・Innodisk等)が長期供給・高信頼性を保証して流通しています。
技術仕様
eMMC規格バージョン
| バージョン | 最大転送速度 | バスクロック | バス幅 |
|---|---|---|---|
| eMMC 4.41 | 52MB/s | 52MHz | 4/8bit |
| eMMC 4.51 | 104MB/s (DDR52) | 52MHz DDR | 4/8bit |
| eMMC 5.0 | 200MB/s (HS200) | 200MHz | 4/8bit |
| eMMC 5.1 | 400MB/s (HS400) | 200MHz DDR | 8bit |
内部構成
eMMCパッケージ(BGA)
├── NANDフラッシュダイ(1〜複数個)
│ └── MLC/TLC NAND(コンシューマ)または SLC NAND(産業用)
└── フラッシュコントローラ
├── FTL(Flash Translation Layer)
│ ├── ウェアレベリング
│ ├── Bad Block管理
│ ├── ECC(BCH/LDPC等)
│ └── ガベージコレクション
├── MMCバスインターフェース
└── キャッシュ(DRAM内蔵モデルも)
パーティション構成
eMMCはハードウェアレベルで複数のパーティションを持ちます:
| パーティション | サイズ | 用途 |
|---|---|---|
| Boot Area Partition 1 | 128KB〜4MB | ブートローダー(U-Boot SPL等) |
| Boot Area Partition 2 | 同上 | ブートローダーバックアップ |
| RPMB(Replay Protected Memory Block) | 128KB〜16MB | セキュアストレージ(鍵・カウンタ) |
| User Data Area | 残り全て | OS・アプリ・データ用 |
電気的特性
- インターフェース: MMCバス(1/4/8ビット)
- 動作電圧: 1.8V / 3.3V(製品により)
- HS400モード消費電流: 100〜300mA(動作時)
- スタンバイ電流: 0.1〜1mA
動作原理
FTL(Flash Translation Layer)
eMMCの内蔵コントローラはFTLを実装しており、ホストが発行するLBA(Logical Block Address)アドレスを物理NANDアドレスに変換します。FTLにより:
- ウェアレベリング: 書き込みを全NANDブロックに均等に分散し、特定ブロックの早期劣化を防ぐ
- Bad Block管理: 不良ブロックを使用リストから除外し、代替ブロックを割り当てる
- ECC: BCH・LDPC符号でビットエラーを検出・訂正する
- ガベージコレクション: 無効データが多いブロックをバックグラウンドで消去・整理する
これらはすべてeMMCコントローラが透過的に処理するため、ホストOS(Linux等)からは通常のブロックデバイス(/dev/mmcblk0)として見えます。
起動シーケンス(ブート)
SoCのブートROMがeMMCのBoot Area Partition 1から第1段ブートローダー(SPL: Secondary Program Loader)を読み込み、SPLがUser AreaのU-Bootを、U-BootがLinuxカーネルを順番にロードします。
SoC Boot ROM
→ eMMC Boot Area Part.1(U-Boot SPL読み込み)
→ DRAM初期化
→ eMMC User Area(U-Boot本体読み込み)
→ FAT/ext4パーティションからカーネル・DTB読み込み
→ Linuxカーネル起動
→ rootfs(ext4 on eMMC)マウント
→ アプリケーション起動
MMCバスプロトコル
ホスト(SoC)とeMMCはMMCプロトコルで通信します。コマンド・データ・クロックの3種の信号で構成され、コマンド(CMD線)で読み書き指示を発行し、データ(DAT0〜DAT7)でデータを転送します。
用途・ユースケース
組み込みLinuxのメインストレージ
Raspberry Pi 4/5・NVIDIA Jetson Nano・STM32MP1 DK等の評価ボードでは、eMMCにLinuxシステムを格納します。典型的なパーティション構成:
# Raspberry Pi Compute Module のeMMC パーティション例
Device Start End Sectors Size Type
/dev/mmcblk0p1 8192 532479 524288 256M W95 FAT32 (boot: kernel/DTB)
/dev/mmcblk0p2 532480 31116287 30583808 14.6G 83 Linux (rootfs: ext4)
OTAアップデートのA/Bパーティション
ファームウェアのOTAアップデードでは、稼働系(A)と待機系(B)の2パーティションを使うA/B方式が一般的です:
┌─────────────────────────────────────────────┐
│ eMMC User Area │
├──────────┬──────────┬──────────┬────────────┤
│ boot │ rootfs_A │ rootfs_B │ data │
│ (256MB) │ (3GB) │ (3GB) │ (残り) │
│ 現在起動 │ 稼働中 │OTA書込み │ユーザーデータ│
└──────────┴──────────┴──────────┴────────────┘
→ OTA完了後: B側を稼働系に切り替えて再起動
RPMBによるセキュアストレージ
eMMCのRPMB(Replay Protected Memory Block)パーティションは、認証済みの書き込みのみ受け付けるセキュアメモリ領域です。HMAC-SHA256で書き込みコマンドを認証し、リプレイ攻撃を防ぐカウンタを内蔵しています。TEE(Trusted Execution Environment)・セキュアブートキー・ロールバック防止カウンタの格納に使われます。
産業用組み込み機器
産業用機器ではSLC NANDベースの産業グレードeMMC(Innodisk FDEM3・Swissbit S-45u等)を使います。書き換え耐久性(100,000 P/E cycles)・動作温度(-40〜+85℃)・長期供給保証(10年以上)が保証されています。
実装・開発のポイント
Linuxでのeemmc操作
Linuxではeemmcは/dev/mmcblk0(または/dev/mmcblkN)として認識されます。mmc-utilsパッケージで詳細情報の確認やRPMBアクセスができます。
# eMMC情報確認
$ cat /sys/class/mmc_host/mmc0/mmc0\:0001/name
XXXXXXXX
$ cat /sys/class/mmc_host/mmc0/mmc0\:0001/fwrev
0x00000000
# mmc-utils でeMMC詳細確認
$ mmc extcsd read /dev/mmcblk0 | grep -E "DEVICE_LIFE_TIME|PRE_EOL"
PRE_EOL_INFO [267]: 0x01 # 0x01: Normal, 0x02: Warning, 0x03: Urgent
DEVICE_LIFE_TIME_EST_TYP_A [268]: 0x01 # 0-10%使用済み
# パーティション情報
$ lsblk /dev/mmcblk0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
mmcblk0 179:0 0 14.7G 0 disk
├─mmcblk0p1 179:1 0 256M 0 part /boot
└─mmcblk0p2 179:2 0 14.4G 0 part /
eMMC寿命管理
eMMCは書き換え回数に上限があります。ロギング・頻繁な設定書き込みなどで早期に寿命を迎えることがあります。対策:
# 書き込み量を削減するオプション(/etc/fstab)
# noatime: アクセス時刻の更新を省略
UUID=xxxx / ext4 defaults,noatime 0 1
UUID=yyyy /boot vfat defaults,noatime 0 2
# tmpfsを使いログ等のRAM書き込みに転換
tmpfs /var/log tmpfs defaults,size=64M 0 0
tmpfs /tmp tmpfs defaults,size=128M 0 0
ブートローダーのeMMC書き込み
U-Bootからeemmcのブート領域を書き込む手順:
# U-BootプロンプトでeMMCブート領域に書き込み
=> mmc dev 0 1 # eMMC Boot Partition 1 を選択
=> mmc write ${loadaddr} 0 ${filesize_hex} # SPL書き込み
=> mmc bootpart enable 1 1 0 # Boot Partition 1 から起動するよう設定
YoctoでのeMMCイメージ生成
Yocto ProjectのWIC(OpenEmbedded Image Creator)でeMMCに書き込む完成イメージを生成できます。
# Yoctoビルド後のeMMC書き込み
$ bzip2 -d core-image-minimal-raspberrypi4.wic.bz2
$ dd if=core-image-minimal-raspberrypi4.wic of=/dev/mmcblk0 bs=4M status=progress
$ sync
他技術との比較
eMMC vs UFS(Universal Flash Storage)
| 項目 | eMMC 5.1 | UFS 3.1 |
|---|---|---|
| 最大読み出し速度 | 400MB/s | 2100MB/s |
| 最大書き込み速度 | 200MB/s | 1200MB/s |
| バスプロトコル | MMC(半二重) | SCSI(全二重) |
| コスト | 低い | 高い |
| 普及度 | 組み込み産業用に強い | スマートフォン主流 |
| ランダムアクセス(4K) | 〜40K IOPS | 〜200K IOPS |
eMMC vs SDカード
SDカードとeMMCは同じMMCプロトコルをベースとしていますが、eMMCは基板半田付け実装(BGA)で取り外し不可・長期信頼性保証・産業グレード品あり、という差があります。コンシューマSDカードは品質差が大きく、組み込み産業用には適しません。
eMMC vs SATA SSD / NVMe SSD
容量・性能ではSATAやNVMe SSDが優れますが、組み込み機器向けの小型・低消費電力・基板直付けという用途ではeMMCが適しています。NVMe SSDは産業用ではM.2やCFexpress形状で採用が増えつつあります。