OS起動編② kvmalloc() (Xv6を読む~OSコードリーディング~)

前回
jupiteroak.hatenablog.com
トップページ
jupiteroak.hatenablog.com




main.c(一部抜粋)
https://github.com/mit-pdos/xv6-public/blob/master/main.c#L21

int
main(void)
{
  ...
  kvmalloc();      // kernel page table
  ...

vm.c
https://github.com/mit-pdos/xv6-public/blob/master/vm.c#L140

void
kvmalloc(void)
{
  kpgdir = setupkvm();
  switchkvm();
}

kvmalloc関数では、kinit1関数で使用可能になったメモリ領域を使って、カーネルスレッドにおいて使用される仮想アドレスの設定(ページングの設定)を行います。


処理の内容

kpgdir = setupkvm();

setupkvm関数を呼び出して、カーネル空間(仮想アドレス0x8000 0000 〜 0xFFFF FFFF)のマッピングのみが設定されたページディレクトリを作成します。
戻り値は、作成されたページディレクトリの先頭アドレスです。

switchkvm();

switchkvm関数を呼び出して、現在使用されているページディレクトリ(entry.Sで設定したページディレクトリentrypgdir)から、カーネルスレッドにおいて使用されるぺージディレクトリkpgdirへ、切り替えを行います(現在動作中のプロセッサが持つCR3に、カーネルスレッドにおいて使用されるぺージディレクトリkpgdirの先頭物理アドレスを設定します)。




次回
jupiteroak.hatenablog.com