メモリマップドI/Oとは?めもりまっぷどあいおー
メモリマップドI/Oとは、主記憶と周辺デバイスに別々のアドレス空間を用意せず、一つの番地空間の一部をデバイスの制御レジスタへ割り当てる設計。デバイスの読み書きが普通のロード/ストア命令で済むので、専用の入出力命令を持たないプロセッサでも周辺を制御でき、C言語からはポインタや構造体としてそのまま扱える。
最終更新:2026-10-06
この語が出る過去問を解く →背景
入出力専用の命令とアドレス空間を別に設ける方式では、命令セットが増え、コンパイラは特別扱いのために組込み関数やアセンブラの助けを必要とする。アドレス空間を1つにまとめれば、番地の一部を周辺回路に割り当てるだけで済み、アドレスデコードの回路も命令セットも単純になる。C言語からポインタで叩けるという性質は、組込みの開発効率をそのまま押し上げた。代償はアドレス空間を消費することと、最適化との衝突に自分で対処する必要があることである。
具体例
Arm Cortex-Mは0x4000_0000以降を周辺領域に割り当て、CMSISのヘッダがレジスタ群をvolatile修飾した構造体として定義している。volatileを付けないと、値が変わらないとみなしたコンパイラの最適化で読み書きが削除されたり順序が入れ替わったりする。
試験での引っ掛け
volatileは最適化の抑止であって、割込みやマルチコアに対する排他制御やアトミック性は保証しない。ここを混同した実装が実機で稀にしか起きない不具合を生む。専用命令を使うI/Oマップド方式(分離I/O方式)との対比、および書込み専用・読出しで状態がクリアされるレジスタの存在も押さえておく。
関連用語
出た過去問
出典:平成30年度 春期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問1(IPA)
メモリマップドI/OのI/Oポートにアクセスするプログラムをc言語で記述するときの注意点として、適切なものはどれか。
正解:コンパイラによる最適化を抑止するために、volatile型修飾子を付けて宣言した変数へのポインタとしてアドレスを指定して、アクセスする。
要点:メモリマップドI/Oはvolatile付きポインタで最適化を抑止する
メモリマップドI/Oでは、I/Oレジスタが主記憶と同じアドレス空間に割り付けられ、通常のメモリアクセスと同じ手段で読み書きする。ただしI/Oレジスタの値はハードウェア側が勝手に書き換えるため、コンパイラが「値は変わらない」と判断してアクセスを削除したり順序を入れ替えたりすると正しく動作しない。そこでvolatile型修飾子を付けたポインタ経由でアクセスし、最適化による読み書きの省略・並べ替えを抑止するのが定石である。
出典:令和2年度 10月試験 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問1(IPA)
メモリマップドI/OのI/Oポートにアクセスするプログラムをc言語で記述するときの注意点として、適切なものはどれか。
正解:コンパイラによる最適化を抑止するために、volatile型修飾子を付けて宣言した変数へのポインタとしてアドレスを指定して、アクセスする。
要点:メモリマップドI/Oはvolatile付きポインタで最適化を抑止する
メモリマップドI/Oでは、I/Oレジスタが主記憶と同じアドレス空間に割り付けられ、通常のメモリアクセスと同じ手段で読み書きする。ただしI/Oレジスタの値はハードウェア側が勝手に書き換えるため、コンパイラが「値は変わらない」と判断してアクセスを削除したり順序を入れ替えたりすると正しく動作しない。そこでvolatile型修飾子を付けたポインタ経由でアクセスし、最適化による読み書きの省略・並べ替えを抑止するのが定石である。
出典・参考
高度試験 午前I(高度午前I 相当)のシラバスの2 コンピュータシステム > 1. オペレーティングシステム > (6) 入出力管理に掲載されている用語です。
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。