MPUとは何か?マイクロプロセッサとメモリ保護ユニットの基礎から実践まで
はじめに:MPUの定義と複数の意味
ITや組み込みの文脈で「MPU」という略語は複数の意味を持ちます。代表的には「MicroProcessor Unit(マイクロプロセッサ・ユニット)」と「Memory Protection Unit(メモリ保護ユニット)」があり、さらにセンサ系では「Motion Processing Unit(モーションプロセッシングユニット)」と呼ばれることもあります。本稿では主に、組み込みシステムやRTOS設計に深く関係する「Microprocessor(マイクロプロセッサ)」としての観点と、セキュリティやタスク分離に直接関係する「Memory Protection Unit(MPU)」について詳しく掘り下げます。
MPU(Microprocessor Unit)としての概要
マイクロプロセッサ(一般的にMPUと略されることがある)は、CPUコアにメモリ管理・入出力制御・割り込みコントローラなどを統合した単体のチップまたはチップセットを指します。パーソナルコンピュータや高性能組み込み機器で使われるx86やARM Cortex-A系は、MMU(Memory Management Unit)を備えて仮想メモリでOSを動かす用途に適します。
- 用途:LinuxやAndroidなどのフルOSを動かす際に利用。
- 特徴:MMUによる仮想メモリ、キャッシュ、複数特権レベル。
MPU(Memory Protection Unit)とは何か
一方で「Memory Protection Unit(MPU)」は、主にマイクロコントローラ(MCU)や低消費電力のリアルタイムシステムで用いられる、メモリアクセス制御のハードウェア機能です。MPUはアドレスの翻訳を行わず、仮想メモリは提供しません。代わりに、物理アドレス上のリージョン(領域)ごとにアクセス許可(読み取り、書き込み、実行)や特権レベル(特権/非特権)を設定し、不正アクセスを防止します。
MPUとMMUの違い(簡潔に)
- 機能:MMUは仮想→物理アドレス変換を行い仮想メモリを提供。MPUはアドレス変換を行わず、アクセス制御のみ。
- 用途:MMUは汎用OS向け、MPUはRTOSやBare-metalの分離・保護向け。
- 実装コスト:MPUはシンプルで消費電力・面積が小さい。
ARM系MPUの具体仕様(代表的な特徴)
多くのARM Cortex-M系コアはMPUを備えています(コアやベンダ実装に依存)。代表的な特徴は次の通りです。
- リージョン数:コアにより異なるが、典型的には8リージョン(Cortex-M3/M4など)。
- リージョンサイズ:2の累乗で表現され、最小は一般に32バイトから(アーキテクチャに依存)。
- サブリージョン:1リージョンをさらに8つのサブリージョンに分割して部分的に無効化可能。
- アクセス属性:読み取り/書き込み/実行の可否、特権/非特権の区別、キャッシュ/バッファ属性(ある場合)。
- 実行不可(XN)ビット:領域毎に実行を禁止し、データ領域でのコード実行を防止可能。
なぜMPUが重要か—実務的意義
組み込みシステムでMPUを使うメリットは明確です。主な効果は以下の通り。
- 安全性向上:誤ったポインタやバッファオーバーフローによる別タスクのメモリ破壊を防止。
- 耐障害性:センサやIOの誤アクセスを制限しシステムの立ち直りを容易にする。
- 最小限のオーバーヘッドでの隔離:MMUほど重くないため、リアルタイム性を維持しやすい。
- ソフトウェアアーキテクチャの簡素化:ドライバやライブラリをより厳密に区分けできる。
MPUの限界と注意点
MPUは万能ではありません。設計上の制約を理解しておく必要があります。
- アドレス翻訳がないため、プロセスごとの仮想アドレス空間は提供できない。
- リージョン数が少ない:複雑なメモリ配置ではリージョンが不足する可能性がある。
- リージョンのサイズ制約:2の累乗とアライメント制約により、細かい制御が難しい場合がある。
- コンテキストスイッチ時のコスト:タスクごとにMPU設定を切り替える必要があり、切り替えコストが発生する。
RTOSとMPUの組み合わせ—実装例と考慮点
RTOS(例:FreeRTOS)では、MPUを利用することでタスク分離を実装できます。FreeRTOSにはMPU対応版があり、各タスクに対するアクセス領域を設定して実行時にMPUレジスタを再設定します。実装上のポイントは以下です。
- タスクごとに必要最小限の領域を割り当て、スタック、データ、パーミッションを明示する。
- 頻繁に切り替わる短時間タスクが多数ある場合、MPU再設定オーバーヘッドが性能に影響するため考慮が必要。
- DMAや周辺機器アクセスはMPUで許可を与える必要があるが、キャッシュやバッファ属性と整合させる。
- 例外や割り込みハンドラは通常特権モードで動作するため、MPU設定との関係を明確にしておく。
セキュリティ観点:MPUの役割
近年の脅威モデルでは、メモリ破壊攻撃やコードインジェクション、ROP(Return-Oriented Programming)などが問題になります。MPUで実行不可領域を設定し、特権レベルを分けることで、侵害の拡大を抑止できます。さらに、ARMv8-MのTrustZone-Mと組み合わせることで、セキュア/ノンセキュア領域を強化し、鍵管理やクリティカル処理を隔離可能です。
設計上のベストプラクティス
- 最小権限の原則を適用する:各タスクには必要最低限のアクセス権のみを付与する。
- スタック保護:スタック領域を専用リージョンとし、隣接領域への侵入を阻止。
- デバッガとの整合:開発時にはデバッグのために一時的に保護を緩めるが、本番ビルドでは必ず有効にする。
- リージョンプランニング:限られたリージョン数の中で、重複や無駄が出ないよう事前にメモリマップを設計する。
- 例外処理:不正アクセス発生時のログやリカバリ手順を設計する(ミドルウェア側のフォールバック)。
実運用でのパフォーマンス考察
MPUチェック自体はメモリアクセスのハードウェアチェッキングで行われるため通常の読み書きに与えるレイテンシは小さいですが、タスク切替時のMPUレジスタ再設定はソフトウェアオーバーヘッドになります。頻繁なコンテキストスイッチや多数のタスクを想定する場合は、リージョン共有やメモリマップ見直しで切替頻度を抑える設計が重要です。
将来動向と関連技術
組み込み向けセキュリティ要求の高まりに伴い、MPU自体も進化しています。ARMv8-MではTrustZone-Mと組み合わせたより強固な分離が可能になり、MPUの属性やリージョン管理の柔軟性が向上しています。また、ハードウェアによる制御フロー保護(CFI)やメモリ安全性を高める言語ランタイムとの組み合わせで、より高信頼なシステム構築が進んでいます。
まとめ
MPUは組み込み系システムにおいて、低コスト・低消費電力でメモリ保護を実現する重要な機能です。MMUとは異なる用途であり、RTOSや裸のファームウェアでのタスク分離、セキュリティ向上に有効です。一方でリージョン数やサイズ制限、切替オーバーヘッドなどの制約があるため、設計段階での計画(リージョニング、最小権限、例外ハンドリング)が不可欠です。適切に使うことで、堅牢で運用性の高い組み込みシステムを作ることができます。
参考文献
- ARMv7-M Architecture Reference Manual
- ARM Cortex-M3 Technical Reference Manual
- FreeRTOS MPU support
- Memory protection - Wikipedia
- ARM TrustZone for Cortex-M
投稿者プロフィール
最新の投稿
用語2025.12.20徹底解説:Spliceが音楽制作にもたらした変革と活用ガイド
ビジネス2025.12.20子ども手当の現状と企業が取るべき対応:財政・人材・働き方から読み解く
用語2025.12.20Omnisphere徹底解説:音作りの核から最新機能、プロが使うテクニックまで
ビジネス2025.12.20基本給とは何か?企業と従業員のための実務ガイド(法令・計算例・見直しポイント)

