TOP
«
»

FreeBSDで物理メモリを参照する方法

任意のページを参照する方法はよくわかりません(汗)
下位メモリ(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 に
サンプルも入っているので作成には困らないと思います。

タグ:

コメントをどうぞ