OS起動編⑮-3 mpenter() (Xv6を読む~OSコードリーディング~)
前回
jupiteroak.hatenablog.com
トップページ
jupiteroak.hatenablog.com
main.c
https://github.com/mit-pdos/xv6-public/blob/master/main.c#L40
// Other CPUs jump here from entryother.S. static void mpenter(void) { switchkvm(); seginit(); lapicinit(); mpmain(); }
mpenter関数は、AP(Application Processor)が利用する、ページディレクトリの参照設定、GDT(グローバルディスクリプタテーブル)の初期化、Local APICの初期化を行っています。
mpenter関数を実行するのは、AP(Application Processor)です。
処理の内容
switchkvm();
switchkvm関数を呼び出して、現在使用されているページディレクトリ(entryother.Sで設定したページディレクトリentrypgdir)から、カーネルスレッドにおいて使用されるぺージディレクトリkpgdirへの切り替えを行います
seginit();
seginit関数を呼び出して、この関数を現在実行しているプロセッサのGDT(グローバルディスクリプタテーブル)を設定し、4種類のセグメントを利用できるようにしています。
lapicinit();
lapicinit関数を呼び出して、各種のLocal APICレジスタに値を設定し、Local APICの初期設定を行なっています。
mpmain();
mpmain関数を呼び出して、プロセッサがプロセスを実行できる状態にします。