たしか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でソース管理されてます