Linuxmaniaトップ活用ガイドメモリマップドI/Oとは?(Fedora,Ubuntu,CentOS)

Linuxmania:活用ガイド


■メモリマップドI/Oとは?(Fedora,Ubuntu,CentOS)


メモリマップドI/Oとは『アドレス空間(仮想記憶方式の場合、物理アドレス空間)上にメモリと入出力機器が共存し、メモリのリード/ライトのためのCPU命令を入出力機器にも使用する手法』のことです。(参考:Wikipedia メモリマップドI/O

この方式では、一続きのアドレスの中に
 (1)メモリにアクセスするためのアドレス
 (2)入出力機器にアクセスするためのアドレス
を用意することで、CPUから見た場合、メモリも入出力機器も
同じようにアクセスすることができます。



ここでは、例として夏目坂モデル採用のマザーボード DG33BU を取り上げます。
DG33BU では、このメモリマップドI/Oの領域として、約3.3GB〜4GB までのアドレス空間が動的に予約されています。(※)

※詳細は、Intelサイトで公開される仕様書(PDF)をご覧ください。(参考:DG33BU Technical Product Specification (PDF) 38ページ付近)

メモリマップドI/O説明グラフ


□メモリマップドI/Oで起きる問題「メモリホール」

メモリマップド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の実装の仕様の兼ね合いにより、
 搭載したメモリすべてを認識することができない現象がおきることが知られています。
 この問題についてここでは解説しませんが「夏目坂モデルで大容量メモリをフルに利用する」ページで、
 メモリを限界まで認識させる方法について紹介しています。
 興味のある方は参考にしてください。
  




■関連情報

Linuxmania活用ガイド:夏目坂モデルで大容量メモリをフルに利用する
Linuxmania活用ガイド:Fedora 8 32bit版で4GB以上のメモリを使う

[作成日 2007/12/5]