これは前の質問に対する後続の質問です。質問。
答えによると、システムコールはプロセス仮想メモリのカーネル部分にジャンプする例です。
システムコールに加えて、仮想メモリのこの部分を使用する一般的なプロセス(非カーネル)の他の例は何ですか?このカーネル部分に直接移動できる関数呼び出しはありますか?それとも..?
メモリのこの部分にジャンプすると、プロセスがメモリのこの部分にアクセスできるように、プロセッサは自動的にカーネルモードビットを1に設定しますか、それともビットを設定する必要がありますか?
このカーネル部分内のすべての実行にカーネルプロセスへのコンテキスト切り替えは必要ありませんか?
(コメントでこのような後続の質問をしたくないので、別のスレッドを開きました。)
ベストアンサー1
ユーザーモードで実行されているプロセスは、カーネルのアドレス空間にまったくアクセスできません。プロセッサがカーネルモードに切り替えてカーネルコードを実行する方法はいくつかありますが、すべてカーネルによって設定され、システムコールの実行、割り込みへの応答、エラー処理など、明確に定義されたコンテキストで発生します。システムコールにはカーネルコードへの直接呼び出しは含まれません。呼び出しプロセスの代わりにその番号で識別される特定のシステム呼び出しを実行するためにCPUがカーネルに制御を送信する必要があるアーキテクチャ固有のメカニズムが含まれています。 LWNには、どのように動作するかを説明する一連の記事があります。システムコール分析 最初の部分、第二部と追加コンテンツ。
プロセスがカーネルアドレス空間のメモリにアクセスしようとすると、カーネルモードになりますが、エラーによるものではなく、カーネルは分割違反のためにプロセスを終了します(
SIGSEGV
)。32ビットx86でははいリモートコールを使用してカーネルモードに切り替えるメカニズムを使用し、コルゲート;ただし、Linuxではこれを使用しません。 (カーネルアドレスを呼び出すのではなく、特別なコードセグメント記述子に依存します。)
上記を参照してください。カーネルメモリにジャンプできません。上記の場合、カーネルモードに切り替えると、CPUは切り替えが許可されていることを確認し、許可されている場合は使用しているアーキテクチャに適したメカニズムを使用してカーネルモードに切り替えます。 x86 Linuxでは、これはリング3からリング0に切り替えることを意味します。
カーネルモードへの移行にはプロセスの変更は含まれていないため、コンテキスト切り替え(カーネルで計算)せずに発生します。