任意のページを参照する方法はよくわかりません(汗)
下位メモリ(BIOSがある領域)は machine/vmparam.h にある KERNBASE から
直接参照できるようです。
たとえば、paddrに物理アドレスのオフセットが入っていると仮定すると、
vaddr = paddr + KERNBASE
これで vaddr にポインタでアクセスできるアドレスが返ってくるようです。
(実際はvaddrの型にキャストが必要でしょう)
逆に仮想アドレスから戻す場合は KERNBASE を引いて、uintptr_t/intptr_tで
キャストすると物理オフセットになります。
適当な例:
#include <sys/types.h> #include <vm/vm.h> #include <vm/pmap.h> #include <machine/vmparam.h> uint32_t paddr; uint8_t *vaddr; paddr = 0x80000; vaddr = (uint8_t *)(paddr + KERNBASE); paddr = (uint32_t)(uintptr_t)(vaddr - KERNBASE);
なぜこんな事をやっているかと言えば、FreeBSDのカーネルモジュールを
作ってみようと思ったからなのです。こちらは、
# man module
で必要な情報が得られますし、/usr/share/examples/kld/cdev/module に
サンプルも入っているので作成には困らないと思います。
タグ: FreeBSD