コンピュータシステム:プログラマの視点説明する
オペレーティングシステムカーネルが厳密なプロセス抽象化を提供するには、プロセッサはアプリケーションが実行できるコマンドと、アプリケーションがアクセスできるアドレス空間の部分を制限するメカニズムを提供する必要があります。
プロセッサは通常、一部の制御レジスタのモードビットを介してこの機能を提供し、これは現在のプロセスで享受する権限を表します。モードビットが設定されると、プロセスはカーネルモード(スーパーバイザモードとも呼ばれます)で実行されます。カーネルモードで実行されるプロセスは、命令セット内のすべての命令を実行でき、システム内のすべてのメモリ位置にアクセスできます。
モードビットがセットされていない場合、プロセスはユーザモードで実行される。ユーザーモードのプロセスは、プロセッサの停止、モードビットの変更、またはI / Oジョブの開始などの特権コマンドを実行できません。アドレス空間のカーネル領域にあるコードやデータへの直接参照も許可されていません。そのような試みは致命的な保護の失敗につながる可能性があります。ユーザープログラムは、システムコールインターフェースを介して間接的にカーネルコードとデータにアクセスする必要があります。
アプリケーションコードを実行するプロセスは、最初はユーザーモードになります。プロセスがユーザーモードからカーネルモードに変更される唯一の方法は、割り込み、エラー、またはトラップシステムコールなどの例外を介することです。例外が発生し、制御が例外ハンドラに渡されると、プロセッサはモードをユーザモードからカーネルモードに変更する。このハンドラはカーネルモードで実行されます。アプリケーションコードに戻ると、プロセッサはカーネルモードからユーザモードにモードを変更します。
ユーザーモードプロセスがカーネルモードに変更したい場合は、常に成功できますか?
モード変更が成功したかどうかは、カーネルモードに変更した後にプロセスが何をしたいかによって異なりますか?
いくつかの例を挙げると、
プロセスのuidとファイルのアクセス制御ビットによっては、プロセスにファイルアクセス権がある場合とない場合があります。プロセスがファイルにアクセスするためにシステムコールを発行した場合、常にユーザーモードからカーネルモードに正常に変更できますか?プロセスをユーザーモードからカーネルモードに切り替えることができるかどうかは、ファイルにアクセスできるかどうかによって異なります。
sudo
プロセスをユーザーモードからカーネルモードに変更できるかどうかは関係ありませんか?
ありがとうございます。
ベストアンサー1
プロセスをユーザーモードからカーネルモードに切り替えることができるかどうかは、ファイルにアクセスできるかどうかによって異なります。
いいえ、プログラムがファイルにアクセスできることを確認する操作はカーネルで行われます。プログラムは、割り込み(x86)またはsyscall
コマンド(amd64)を使用する必要があるときにカーネルを呼び出すことができます。
sudoは、プロセスをユーザーモードからカーネルモードに変更できるかどうかには関係ありませんか?
sudo
ユーザーモード/カーネルモードとは何の関係もありません。スーパーユーザーアカウントはまだユーザーモードにのみ存在します。