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の時は、ユーザープロセスがページフレームにアクセスできないことを示しています。