ユーザーモードプロセスがカーネルモードに変更したい場合は、常に成功できますか?

ユーザーモードプロセスがカーネルモードに変更したい場合は、常に成功できますか?

コンピュータシステム:プログラマの視点説明する

オペレーティングシステムカーネルが厳密なプロセス抽象化を提供するには、プロセッサはアプリケーションが実行できるコマンドと、アプリケーションがアクセスできるアドレス空間の部分を制限するメカニズムを提供する必要があります。

プロセッサは通常、一部の制御レジスタのモードビットを介してこの機能を提供し、これは現在のプロセスで享受する権限を表します。モードビットが設定されると、プロセスはカーネルモード(スーパーバイザモードとも呼ばれます)で実行されます。カーネルモードで実行されるプロセスは、命令セット内のすべての命令を実行でき、システム内のすべてのメモリ位置にアクセスできます。

モードビットがセットされていない場合、プロセスはユーザモードで実行される。ユーザーモードのプロセスは、プロセッサの停止、モードビットの変更、またはI / Oジョブの開始などの特権コマンドを実行できません。アドレス空間のカーネル領域にあるコードやデータへの直接参照も許可されていません。そのような試みは致命的な保護の失敗につながる可能性があります。ユーザープログラムは、システムコールインターフェースを介して間接的にカーネルコードとデータにアクセスする必要があります。

アプリケーションコードを実行するプロセスは、最初はユーザーモードになります。プロセスがユーザーモードからカーネルモードに変更される唯一の方法は、割り込み、エラー、またはトラップシステムコールなどの例外を介することです。例外が発生し、制御が例外ハンドラに渡されると、プロセッサはモードをユーザモードからカーネルモードに変更する。このハンドラはカーネルモードで実行されます。アプリケーションコードに戻ると、プロセッサはカーネルモードからユーザモードにモードを変更します。

ユーザーモードプロセスがカーネルモードに変更したい場合は、常に成功できますか?

モード変更が成功したかどうかは、カーネルモードに変更した後にプロセスが何をしたいかによって異なりますか?

いくつかの例を挙げると、

  • プロセスのuidとファイルのアクセス制御ビットによっては、プロセスにファイルアクセス権がある場合とない場合があります。プロセスがファイルにアクセスするためにシステムコールを発行した場合、常にユーザーモードからカーネルモードに正常に変更できますか?プロセスをユーザーモードからカーネルモードに切り替えることができるかどうかは、ファイルにアクセスできるかどうかによって異なります。

  • sudoプロセスをユーザーモードからカーネルモードに変更できるかどうかは関係ありませんか?

ありがとうございます。

答え1

プロセスをユーザーモードからカーネルモードに切り替えることができるかどうかは、ファイルにアクセスできるかどうかによって異なります。

いいえ、プログラムがファイルにアクセスできることを確認する操作はカーネルで行われます。プログラムは、割り込み(x86)またはsyscallコマンド(amd64)を使用する必要があるときにカーネルを呼び出すことができます。

sudoは、プロセスをユーザーモードからカーネルモードに変更できるかどうかには関係ありませんか?

sudoユーザーモード/カーネルモードとは何の関係もありません。スーパーユーザーアカウントはまだユーザーモードにのみ存在します。

答え2

ユーザーモードプロセスがカーネルモードに変更したい場合は、常に成功できますか?

実際の目的ではそうです。プロセスが必ずしもカーネルモードに変更することを「サークル」するわけではありません。プロセッサは、プロセスが特権操作を試みるか、特権「ゲート」を呼び出すたびにカーネルモードに切り替えます。

特権タスクを構成する詳細はアーキテクチャごとに異なりますが、広く言うと次のようになります。

  • カーネル以外の制御を適用しないようにグローバルシステムの状態に影響を与える特権CLIコマンドHLT
  • IN特権レベル(x86では命令/OUTファミリ)に応じた特定のタイプの入力/出力命令
  • 現在プロセスがアクセスできないメモリにアクセスしようとします。
  • 現在、プロセスの実行が許可されていないメモリ領域でコードを実行しようとしました。

他のガイドラインや状況も最終的にカーネルをトラップしたり失敗したりしますが、必ずしもそうではありません。特権自体 - たとえば、ゼロに分割してみてください。

カーネルモードに切り替えるために必要な情報が正しく設定されていない場合、プロセッサにエラーが発生し、エラーが正しく処理されない場合、通常は再起動されます。 (望むより二重果実そしてトリプルエラー.)

詳細については、関連プロセッサのマニュアル(例えば インテルマニュアル)。

x86-64でSYSCALLシステムコールを呼び出すために使用される命令は、「一般」命令と特権命令の間にあり、常に呼び出し可能であり、コードは常に特権モードで呼び出されます。

モード変更が成功したかどうかは、カーネルモードに変更した後にプロセスが何をしたいかによって異なりますか?

いいえ。

プロセスがファイルにアクセスするためにシステムコールを発行した場合、常にユーザーモードからカーネルモードに正常に変更できますか?プロセスをユーザーモードからカーネルモードに切り替えることができるかどうかは、ファイルにアクセスできるかどうかによって異なります。

いいえ、カーネルモードへの移行は、呼び出し元が要求した操作を実行できるかどうかを判断するなど、カーネルコードが実行される前に発生します。

sudoプロセスをユーザーモードからカーネルモードに変更できるかどうかは関係ありませんか?

いいえ。ここで、特権はプロセッサの実行レベルとメモリ保護に固有のものであり、ユーザ特権​​(たとえば、ユーザ/ルートの区別)とは全く別のものです。

答え3

カーネル空間には明確に定義されたエントリポイントがあります。

テーブルが存在します(カーネルモードでのみ書き込み可能)。これには多くのルーチンの開始アドレスが含まれます。これには、分割エラー、ゼロ除算、ハードウェア割り込み、システムコールなどで実行されるルーチンが含まれます。

したがって、プロセスはシステム呼び出し(1つ以上の可能性があります)コマンドを発行して遷移をトリガーできます。ただし、ユーザーモードコードは実行するコードを指定できません。システムコールでは、カーネルモードはレジスタの内容を見て、プロセスが何を望むかを決定し、プロセスのユーザー、グループ、機能などを見てそれを行うことができるかどうかを決定します。

関連情報