読者です 読者をやめる 読者になる 読者になる

minix3のシステムコール呼び出しメモ 

kernel minix

たしか1年以上前にMinix本読書会で調べてたはずなんだけど、すっかり忘れてたのでここに書いときます。
モノリシックカーネルマイクロカーネルの違いを忘れるとダメですねorz このメモの内容はオペレーティングシステム 第3版のP206のメモです。

さて、システムコール(fork(2), write(2)とか)はモノリックカーネルならユーザ空間でシステムコールを発呼して、ソフトウェア割り込みという形でカーネルが受けますね。実装としてはsysenterだったり、昔のLinuxだったらint $0x80だったりなんかですね。

次にマイクロカーネルの場合ですけど、というかオペレーティングシステム 第3版のMinix3ですが、これはユーザ空間の通常のアプリケーションからfork(2)が発呼されるとマイクロカーネルのサーバが受け取ります。
モノリシックカーネルならソフトウェア割り込みなところがメッセージとしてサーバに渡ります。そして、サーバからカーネルにソフトウェア割り込みを使ったシステムコールの発呼が行われる感じです。
Minix本だとユーザのプログラムからサーバまでの呼び出しに使う関数を「システムコール」、サーバからカーネルの呼び出しに使う関数は「カーネルコール」と使い分けてます。

これだけだとなんなので、コードも付けてφ(.. )メモシテオコウ

PMサーバのdo_fork()がユーザプログラムから呼ばれる部分。

PUBLIC int do_fork()
{
/* The process pointed to by 'mp' has forked. Create a child process. */

中略

/* Tell kernel and file system about the (now successful) FORK. */
sys_fork(who, child_nr);
tell_fs(FORK, who, child_nr, rmc->mp_pid);

中略

ここのsys_fork()でkernel/system/do_fork.cにのdo_fork()が呼ばれる。sys_fork()で呼ばれるのはdo_fork()。

PUBLIC int do_fork(m_ptr)
register message *m_ptr; /* pointer to request message */
{
/* Handle sys_fork(). PR_PPROC_NR has forked. The child is PR_PROC_NR. */

このdo_forkで親プロセスのproc構造体が子にコピーされるとかの処理が入って、returnする。そうすると次はtell_fs()の部分でfsサーバのdo_fork()が呼ばれると。ここはfproc構造体のコピーなんかしてます。

PUBLIC int do_fork()
{
/* Perform those aspects of the fork() system call that relate to files.
* In particular, let the child inherit its parent's file descriptors.
* The parent and child parameters tell who forked off whom. The file
* system uses the same slot numbers as the kernel. Only MM makes this call.
*/

そしてfsサーバのdo_fork()が終わると、pmサーバのdo_fork()に戻っていくつか処理を下後にreturnするという感じです。

ちなみに本のバージョンのMinixのメモリ管理はページング使って無くて、x86のセグメントモデルでコピーオンライトとかはやって無いです。

今のMinixはgitでソース管理されてます