Memory Mapped I/O
gpt-5.icon
デバイスのレジスタを、CPUのメモリアドレス空間の一部として割り当てる方式
つまり CPU から見ると「普通のメモリ読み書き」と同じ命令で、ハードウェアを操作できます。
何をしている仕組みか
通常の RAM と同じアドレス空間の中に、
0x4000_0000〜0x4000_0FFF → UART 0x5000_0000〜 → GPU
0x6000_0000〜 → NIC
のようにデバイス専用領域を割り当てます。
CPU がそのアドレスに load/store すると:
1. メモリコントローラが「これはデバイス領域だ」と判断
2. 対応するデバイスにバス越しでアクセス
3. デバイスのレジスタが読み書きされる
という流れになります。
具体例(超シンプル)
たとえば LED 制御レジスタが 0x40000000 にある場合:
code:c
#define LED_REG (*(volatile unsigned int*)0x40000000) LED_REG = 1; // LED ON
LED_REG = 0; // LED OFF
これは「メモリに書いている」ように見えて、実際は LED デバイスを直接操作しています。
ポイントは:
volatile:最適化で消されないようにする(実体はハード)
普通のポインタアクセスで OK