まず、3 つの質問が表示されます。
- プロセスの特権レベルを最初に決定するのは誰/何ですか?
- プロセスが低い特権レベルまたは高い特権レベルで実行されることが決定されるのはいつですか?
- 現在のプログラムが特定の特権レベルで実行されることを示すものは何ですか?
次に、いくつかの用語の定義を確認する
特権レベルと言うとき、利用可能な他の特権メカニズムの一般的なレベルとは対照的に、CPU プロセッサ モードに関連付けられた特権レベルの概念について言及していると思います。
プロセスと言うとき、別の定義ではなく、現在実行中のプログラムの概念について言及していると思います。
ユーザー プロセスは、特定の CPU アーキテクチャのユーザー権限でユーザー モードで実行されます。
カーネル プロセスは、特定の CPU アーキテクチャのスーパーバイザー特権を持つカーネル モードで実行されます。
プロセスがユーザーかカーネルかは、ページングが使用されていない場合はセグメント記述子で、ページングが使用されている場合はページ テーブルまたはページ ディレクトリ エントリでどのフラグが設定されているかによって異なります。
これは、プロセスの特権レベルが、そのプロセスのコードがメモリ内のどこにあるかによって決定されることを意味します。カーネル空間にあり、関連するフラグを使用してそのようにマークされている場合、それはカーネル プロセスです。ユーザー空間にあり、関連するフラグを使用してそのようにマークされている場合、それはユーザープロセスです。
実行しているプロセス/プログラムがカーネルでない場合、それはほとんどの最新のオペレーティング システムのユーザー プロセスです。したがって、決定が下されるのはプログラムの実行時、特にカーネルが最初にロードされるオペレーティングシステムの初期化時です。
プロセスはそのカーネルであり、スーパーバイザー特権レベルで実行されるか、そうではなく、ユーザー特権レベルで実行されます。
CPU は、関連するステータス レジスタ (Intel X86 ではコード ステータス レジスタ、ARM では現在のプログラム ステータス レジスタ) に対して、メモリからのコードまたはデータ セグメントのすべての実行をチェックします。
ユーザー プロセスがカーネル リソースにアクセスする必要がある場合、これが行われる一般的な方法は、システム コールを作成することによって、ユーザー プロセスが代わりにカーネル プロセスに要求できるようにすることです。ユーザープロセス。
補足として、Kernel Mode Linux では、カーネル/スーパーバイザー モードでユーザー プロセスを実行できます。
参考文献と参考資料