私は現在、オペレーティングシステムの概念を理解しようとしています(Unixライクなマシン上で)
カーネルはPID0のプロセスです。もちろん、プロセスはカーネルの概念であるため、カーネルは実際には「単なる別のプロセス」ではありませんが、カーネルが他のコンポーネントに制御を与えるわけではありません(...?)。
カーネルが実行できることはすべて、カーネルのソースコードで調べることができます(たとえば、LinuxカーネルはGithubにあり、誰でも見ることができます)
したがって、オペレーティングシステムは、アクティブな「プロセス」としてカーネルから開始します。次に、他のプロセス(PID 1のプロセスなど)にタイムスライスを生成しますが、同時に、カーネルに制御を戻すことを保証します。
したがって、CPUの制御は常に次のようになります。カーネル->いくつかのプロセス->カーネル->いくつかのプロセス->(...)
決して:いくつかのプロセス->いくつかのプロセス
システムコールは、カーネルが実行できるいくつかのことを実行するためのユーザーランドプロセスのAPIです。プログラムのすべての「高度な機能」(ファイルへのアクセス、Webへの接続)は、一部のシステムコールにまでさかのぼることができます。
重大な誤解はありますか?
UNIXの種類が異なれば、アーキテクチャも異なります。 Linuxおよび従来のモノリシックUNIXシステムでは、カーネルはnotプロセスです。これは、すべてのプロセスのメモリ空間(通常は上位ビットが設定されたアドレス)にマップされるコードとデータのブロックですが、 I/O特権レベル。プロセスがシステムコールを行うと、割り込みがトリガーされ、CPUがより高い特権レベルに切り替わり、割り込みが戻るまでカーネルコードとデータにアクセスできるようになります。 init
(PID 1)やgetty
(initで開始)のようなプロセスはカーネルではなく、システムによって自動的に開始される通常のユーザーモードプロセスです。
他のUNIXシステム、たとえばMachは、 マイクロカーネルアーキテクチャ を使用し、複数のサブシステムを別々のプロセスとして実行しています。