Linuxにおける論理アドレスと物理アドレス間の変換(virt_to_physとphys_to_virtとioremap)

物理メモリと仮想メモリのアドレス変換が出来なくて困っていた。

意外とちゃんと説明しているサイトは少ないようだ。

どのサイトもvirt_to_physとphys_to_virtを使えば良いということであったが…

virt_to_physとphys_to_vortを使うにはC言語の範疇には収まらないものをincludeしなければならない。具体的に言えばカーネルのヘッダーだ。

#include <asm/io.h>

こうして変換してみたものの、ペリフェラルにアクセスするとカーネルが落ちてしまった。

実はphys_to_virtは完璧な訳ではなく、io空間にアクセスするにはioremapを使わなければならないらしい。

ということでまとめてみると、

  • 論理アドレスから物理アドレス
    • virt_to_phys
  • 物理アドレスから論理アドレス
    • 元々virt_to_physで変換したアドレスやプログラム中で確保されている領域
      • phys_to_virt
    • ペリフェラル
      • ioremap

となります。