物理メモリと仮想メモリのアドレス変換が出来なくて困っていた。
意外とちゃんと説明しているサイトは少ないようだ。
どのサイトも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
- 元々virt_to_physで変換したアドレスやプログラム中で確保されている領域
となります。