Mac OS Xのカーネル Xnuのメモ書き

ページング


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を作成して設定



最終更新 2006/06/03 15:45:22 - kztomita
(2006/06/03 12:52:30 作成)


最近更新したページ