質問: ユーザーが作ったプロセスは通常ユーザーモードで動作していますが、 プロセスがシステムコールを発行するとプロセス自身がカーネルモードに移行するんですか?? 自分は今まで ユーザーモードで動作するプロセスがシステムコールを発行するとカーネルモードで動作しているプロセスに処理を依頼するのだと思っていたのですが・・・ Linuxカーネル第3版の本に”プロセス自身がユーザーモードからカーネルモードへと移行する。カーネルがユーザーの要求を満たした後、再びユーザーモードに戻る”というようなことが書いてありました。 もしかして自分の理解は間違っていましたか?? 1つのプロセス内に2つの動作を切り変えながら動いているのですか?? システムコールを発行する瞬間のみカーネルモードに変わるのですか?? システムコールラッパーのあたりに入ってくるとカーネルモードに変わってくるんですか?? なぜカーネルモードに移行する必要があるのでしょうか?? プロセス自信がカーネルモードに移行できるならわざわざシステームコールなどという概念はそもそも必要なくても良いので? ”システームコールはユーザーモードとカーネルモードの橋渡しをする役割を担う”というのを読んだことがあります。 そうなるとシステムコールとは何でしょう?? と色々考えてしまうのです。 またユーザーモードとカーネルモードはそれぞれCPUのモードだと書いてありました。 CPUのモードということはハードウェア的にモードを切り替えているということですか?? どうやって実現しているのでしょうか? 今までソフトウェア的にモードを使い分けていると思っていました。 リアルモードと保護モードはMMUのon/offでできそうですが・・・ どなたか教えてください!
回答: ソフトウェア割り込みってのを使っています。 割り込みというのはCPUの機能で、あるイベントが発生したらいつでも実行中のプログラムを一時中断してこのアドレスからのプログラムを実行せよ、というイベントハンドラをCPUに予約しておけるのです。 このイベントというのは外部デバイスからの入力があったなどのハードウェアイベントの他、プログラムがソフトウェア的に発生させるイベントもあります。後者でハンドラが呼び出されるのがソフトウェア割り込み。 システムコールが発行されると、それを処理するOSの関数(ユーザーランドで実行されています)はこのソフトウェア割り込みを発生させます。ハンドラにはあらかじめカーネルランドのコードが登録されており、カーネルランドのコードは処理が終わったら制御を返してくる、という流れになります。