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の先頭物理アドレスを設定します)。