オペレーティングシステムがロードされると、カーネルは通常のプログラムとして実行され続けますか?

オペレーティングシステムがロードされると、カーネルは通常のプログラムとして実行され続けますか?

私の質問に似た質問があります。https://stackoverflow.com/questions/43819072/does-the-kernel-stop-running-on-its-own-when-the-os-is-complete-loadedしかし、答えは矛盾します(したがって、この質問を重複としてマークしないでください)。


私の質問に戻ります。コンピュータの電源が入ると、BIOSが起動し始め、BIOSがブートローダを実行し、ブートローダがカーネルを実行していることがわかります。

カーネルは通常のプログラムとして実行を開始します(「一般的なプログラム」とは、カーネルが他のプログラムから呼び出される関数のセットではなく、独立して実行されるプログラムでもあることを意味します)。カーネルは次のタスクを実行します。

  • ハードウェアとカーネルのデータ構造を初期化します。
  • 保護モードに切り替えます。
  • 割り込み記述子テーブルを初期化します。
  • ちょっと待って(これは記事カーネルで実行される追加操作をリストします。

カーネルがこれらの操作を完了すると、オペレーティングシステムがロードされ、ユーザーはそれを使用できます。

私の質問は次のとおりです。OSがロードされたため、カーネルは通常のプログラムとして実行され続けますか、それともこのように実行を停止し、割り込みが発生した場合にのみ実行されますか?

ベストアンサー1

すべてのカーネルは「一般プログラム」とほぼ正反対です。マイクロカーネルの人々は、ユーザーアプリケーションと同じレベルのプロセスで実行されるオペレーティングシステムサービスのアイデアを好むかもしれませんが、カーネルはいつもそうでない部分も含める必要があります。他に何もない場合は、プロセス間のスケジュールと移行、およびプロセス間通信を処理するオペレーティングシステムの一部が必要です。

特にLinuxでは、カーネルはすべてのプロセスのアドレス空間にマッピングされ、アドレス空間の上位部分に配置されます。一部のプロセスがカーネルコードを実行し、他のプロセスがユーザースペースコードを実行できるという点で、これはすべてのプロセスの一部です。

カーネルが通常のプログラムとして実行されるとは言えませんが、ユーザー空間コードがカーネルルーチンを呼び出す可能性があるため、割り込み時に「のみ」は実行されません。これがまさにシステムコールです。割り込みはまったく例外ではないため、「only」の引用符、定期的なタイマーティックの一種が一般的です。

おすすめ記事