メモリ・ストレージ

eMMC

基板実装型のフラッシュストレージ。組み込みLinux機でよく使う。

概要

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.4152MB/s52MHz4/8bit
eMMC 4.51104MB/s (DDR52)52MHz DDR4/8bit
eMMC 5.0200MB/s (HS200)200MHz4/8bit
eMMC 5.1400MB/s (HS400)200MHz DDR8bit

内部構成

eMMCパッケージ(BGA)
├── NANDフラッシュダイ(1〜複数個)
│    └── MLC/TLC NAND(コンシューマ)または SLC NAND(産業用)
└── フラッシュコントローラ
     ├── FTL(Flash Translation Layer)
     │    ├── ウェアレベリング
     │    ├── Bad Block管理
     │    ├── ECC(BCH/LDPC等)
     │    └── ガベージコレクション
     ├── MMCバスインターフェース
     └── キャッシュ(DRAM内蔵モデルも)

パーティション構成

eMMCはハードウェアレベルで複数のパーティションを持ちます:

パーティションサイズ用途
Boot Area Partition 1128KB〜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により:

  1. ウェアレベリング: 書き込みを全NANDブロックに均等に分散し、特定ブロックの早期劣化を防ぐ
  2. Bad Block管理: 不良ブロックを使用リストから除外し、代替ブロックを割り当てる
  3. ECC: BCH・LDPC符号でビットエラーを検出・訂正する
  4. ガベージコレクション: 無効データが多いブロックをバックグラウンドで消去・整理する

これらはすべて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.1UFS 3.1
最大読み出し速度400MB/s2100MB/s
最大書き込み速度200MB/s1200MB/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形状で採用が増えつつあります。

関連用語

参考リンク