Linuxmaniaトップ > 活用ガイド > メモリマップドI/Oとは?(Fedora,Ubuntu,CentOS)
メモリマップドI/O方式では、本来約3.3GB〜4GBのアドレスにマッピングされている物理メモリにアクセスできなくなる「メモリホール」と呼ばれる現象が発生します。
図(2) メモリマップドI/O
I/Oと表示されている部分に相当する物理メモリにアクセスできません。
このアドレスにアクセスすると入出力機器にアクセスすることになってしまいます。
この問題は Linux や Windows などで確認されており、各 OS によって独自の対応がなされています。一般には、32ビットOSでは制限事項とされ、64ビットOSでは仮想アドレスへのマッピングが行われることが多いようです。
Fedora 8(x86_64) では、この対策として、Linuxカーネルが物理メモリを仮想アドレスにマッピングします。
I/O用の領域以上に相当する部分のアドレスが 0.7GB ほど上位の仮想アドレスにマッピングし直されるようです。
実際のアドレスは /proc/iomem ファイルに記載されていますので「cat /proc/meminfo」等と
実行することで見ることができます。
図(3) Linux仮想アドレス
I/O と表示されている部分の分だけ上にずれているのがわかると思います。
これによって入出力機器用のアドレスと物理メモリ用のアドレスが重複することを防ぎ、
物理メモリ全体にアクセスできるようになります。
※ただし、Linuxでは、マザーボードの仕様とメモリマップドI/Oの実装の仕様の兼ね合いにより、
搭載したメモリすべてを認識することができない現象がおきることが知られています。
この問題についてここでは解説しませんが「夏目坂モデルで大容量メモリをフルに利用する」ページで、
メモリを限界まで認識させる方法について紹介しています。
興味のある方は参考にしてください。