6

これに出くわしたとき、私は自分のOSブックでLinuxがどのように機能するかを読んでいました。

[...]カーネルは単一のモノリシックバイナリとして作成されます。主な理由は、パフォーマンスを向上させることです。すべてのカーネルコードとデータ構造は単一のアドレス空間に保持されるため、プロセスがオペレーティングシステム関数を呼び出すとき、またはハードウェア割り込みが配信されるときに、コンテキストスイッチは必要ありません。

それは私には非常に驚くべきことのように聞こえました。確かに、割り込みを処理するためにカーネルモードで実行する前に、プロセスのコンテキストを保存する必要があります。プロセスのスケジューリングコンテキストを説明しながら、数ページで次のように述べています。

プロセスの実行中に発生するシステムコールと割り込みの両方で、このスタックが使用されます。

「このスタック」は、カーネルがプロセスのレジスタなどを格納する場所です。

これは最初の引用と直接矛盾していませんか?どういうわけかそれを誤解していますか?

4

3 に答える 3

6

最初の引用は、モノリシックカーネルとマイクロカーネルの違いに言及していると思います。

Linuxはモノリシックであり、そのすべてのカーネルコンポーネント(デバイスドライバー、スケジューラー、VMマネージャー)はリング0で実行されます。したがって、システムコールを実行したり、割り込みを処理したりするときに、コンテキストスイッチは必要ありません。

デバイスドライバーやIPCプロバイダーなどのコンポーネントがリング0の外側のユーザースペースで実行されるコントラストマイクロカーネル。したがって、このアーキテクチャでは、システムコールの実行(実行モジュールがユーザースペースに存在する可能性があるため)および割り込みの処理(リレーするため)時に追加のコンテキストスイッチが必要です。デバイスドライバへの割り込み)。

于 2012-01-16T10:40:50.827 に答える
4

「コンテキストスイッチ」とは、(1)システムコールを処理するためのユーザーモードからカーネルモードへの切り替え、または割り込みスタックに対する割り込みを処理するためのカーネルモードへの非自発的な切り替え、または(2) )ユーザースペースで別のユーザープロセスを実行するように切り替え、2つの間にカーネルスペースにジャンプします。

ユーザースペースからカーネルスペースへの移動は、確実に戻るのに十分なユーザースペースを節約することを意味します。カーネルスペースコードが、そのプロセスのユーザーコードを実行していなくても、別のユーザープロセスを実行させるときが来たと判断した場合は、それが実行されます。

したがって、少なくとも、「コンテキスト」を格納するための2〜3個のスタックまたは場所について話していることになります。ハードウェア割り込みには、何に戻るかを指定するためのカーネルレベルのスタックが必要です。ユーザーメソッド/サブルーチン呼び出しは、それを実行するために標準スタックを使用します。等。

元のUnixカーネル(この部分のモデルは今ではそれほど変わりません)は、朝食の注文を処理する短期注文の料理人のようにシステムコールを実行しました。これをストーブに移動して、到着したばかりのベーコンの注文のためのスペースを作ります。ベーコンを始めて、最初の注文に戻ります。すべてカーネルスイッチングコンテキストで。巨大な監視アプリケーションではなかったため、IBMとDECのソフトウェア関係者はおそらく怒りました。

于 2012-11-13T16:45:57.660 に答える
1

Linuxでシステムコールを行う場合、コンテキストスイッチはユーザースペースからカーネルスペース(ring3からring0)に実行されます。各プロセスには、システムコールで使用されるカーネルモードスタックが関連付けられています。システムコールが実行される前に、プロセスのCPUレジスタはユーザーモードスタックに格納されます。このスタックはカーネルモードスタックとは異なり、プロセスがユーザースペースの実行に使用するスタックです。

プロセスがカーネルモード(またはユーザーモード)の場合、同じモードの関数を呼び出すためにコンテキストスイッチは必要ありません。これは最初の引用で参照されているものです。

2番目の引用符は、ユーザーモードスタックではなく、カーネルモードスタックを参照しています。

そうは言っても、システムコールを実行するためにカーネルスペースに移行する必要がない、つまりシステムコールに関連するすべての処理がユーザースペース自体で行われるLinuxの最適化について言及する必要があります(したがってno context switch)。vsyscall、およびVDSOそのような手法です。それらの背後にある考え方は非常に単純です。対応するシステムコールの実行に必要なデータをユーザースペースに送信します。詳細については、このLWNの記事をご覧ください。

これに加えて、すべての実行が同じリングで行われるいくつかの研究プロジェクトがありました。ユーザースペースプログラムとOSコードは、どちらもにありますsame ring。アイデアは、リングスイッチのオーバーヘッドを取り除くことです。Microsoftの[特異点][2]OSはそのようなプロジェクトの1つです。

于 2016-07-09T15:19:16.483 に答える