vm.c void clearpteu(pde_t *pgdir, char *uva)
トップページ
jupiteroak.hatenablog.com
vm.c
https://github.com/mit-pdos/xv6-public/blob/master/vm.c#L302
void clearpteu(pde_t *pgdir, char *uva) { pte_t *pte; pte = walkpgdir(pgdir, uva, 0); if(pte == 0) panic("clearpteu"); *pte &= ~PTE_U; }
clearpteu関数は、仮想アドレスuvaに対応しているPTEのbit2(ページテーブルエントリのU/Sフラグ)を0にします。
引数 pde_t *pgdir
ページディレクトリの先頭アドレスです。
引数 char *uva
設定対象となるPTE(ページテーブルエントリ)に対応している仮想アドレスです。
処理の内容
仮想アドレスuvaに対応しているPTE(ページテーブルエントリ)を取得する
pte = walkpgdir(pgdir, uva, 0); if(pte == 0) panic("clearpteu");
walkpgdir関数を呼び出して、仮想アドレスuvaに対応しているpte(ページテーブルエントリ)を取得します。
pte == 0 が真の場合は→pte(ページテーブルエントリ)を取得できなかった場合は、panic関数を呼び出して、メッセージを出力します。
PTEのbit2(ページテーブルエントリのU/Sフラグ)を0にする
*pte &= ~PTE_U;
pte(ページテーブルエントリ)に、PTE_U(#define PTE_U 0x004→0b0100)をビット反転した値~PTE_U(0xFFFF FFFB)をビット積代入することで、pteのbit2(ページテーブルエントリのU/Sフラグ)だけを0にします。
pdeのbit2(ページテーブルエントリのU/Sフラグ)が0の時は、ユーザープロセスがページフレームにアクセスできないことを示しています。