ページング
Rev.3を表示中。最新版はこちら。
pmap_enter(pmap, v, pn, prot, flags, wired)PageDirectory,PageTableを設定して指定仮想アドレス(v)に物理ページ(pn:ページフレーム番号)をマッピングする。protでは許可するアクセス種別(Write可,Read可,コードの実行可)を指定する。
pmapから仮想アドレス(v)に該当するPageTableEntry(pte)を割出し以下の設定をする。
pvも合わせて設定する。
pv_h->va = v;
pv_h->pmap = pmap;
pv_h->next = PV_ENTRY_NULL;
PTEの2^9〜11bitのAvailフィールド(OSが自由に使ってよい領域)はxnuでは以下のように使用している。
#define INTEL_PTE_GLOBAL 0x00000100
#define INTEL_PTE_WIRED 0x00000200
old_pa = pte_to_pa(*pte);
if (old_pa == pa) {
PTEが存在して、マップする物理アドレスにも変更がない場合の処理
ページをReadOnlyに変更するなど属性を変更する時はこちらに入る
ProtectionなどBitを再設定してPTEに書き込んで終了
}
if (old_pa != (pmap_paddr_t) 0) {
すでに別の物理アドレスにマップされていた場合の処理
pv_entryから外す
} else {
新規マッピング
統計のみ更新以下の処理でマッピングを行なう
}
if (valid_page(i386_btop(pa))) {
マッピングを作成
pv_entryを作成する
pv_h->va = v;
pv_h->pmap = pmap;
pv_h->next = PV_ENTRY_NULL;
pv_hがマップすみならpv_hのnextポインタにつなぐ
pv_e->va = v;
pv_e->pmap = pmap;
pv_e->next = pv_h->next;
pv_h->next = pv_e;
}
PTEを作成して設定