プログラムはカーネルモードで実行できますか?

プログラムはカーネルモードで実行できますか?

私が理解しているように、割り込みが発生した場合(システムコール、キーボードキーの押下など)、CPUはカーネルモードでカーネルコードを実行しますが、独立して実行されるプログラムがあるかどうかを知りたいと思います。モードでトリガされたカーネル割り込みで実行します。

つまり、スケジューラが実行をユーザーモードのプロセスに切り替えると実行されますが、スケジューラは実行を切り替える「プロセス」があるかもしれませんが、この「プロセス」はカーネルモードで実行されるカーネルモードにあります(カーネルモードで実行されます)プログラムを「プロセス」と呼ぶことができるかどうかはわかりませんか?

ベストアンサー1

この質問に答えるには、まずいくつかの用語を明確にする必要があります。

仮想メモリアドレスは次のように区切られます。ユーザースペースそしてカーネル空間。一部のアーキテクチャでは、両方とも単一の線形アドレス空間の一部であり、他のアーキテクチャでは別々のアドレス空間である。

指定された時間に CPU が実行中です。ユーザーモードまたはカーネルモード。存在するカーネルモード読み書きできるなど、より多くの権限を持つようになります。ユーザースペースそしてカーネル空間。一部の CPU にはより多くの特権レベルがあります。たとえば、AMD64準拠のCPUにはオペレーティングシステムで使用できる4つの特権レベルがありますが、Linuxでは2つだけを使用します。

CPUがユーザーモードで実行されているときにカーネルスペースへのポインタを操作できますが、これらのポインタが指すエントリにアクセスしようとすると例外がスローされます。ユーザーモードで実行すると、CPUはユーザースペースでバイトを読み書きすることができ、他の制限が適用されることがあります(たとえば、同じ範囲で書き込みと実行を許可しないようにメモリマップを設定できます)。

ユーザーモードでは、例外または割り込みを介してのみカーネルモードに入ることができ、これは以前にカーネルが設定したカーネル空間のアドレスで実行を開始します。したがって、ユーザー空間のコードをカーネルモードで実行する直接的な方法はありません。

しかし、カーネルコードがユーザー空間のアドレスにジャンプすることは可能ですが、これは良い考えではありません。カーネルモジュールをロードする権限で実行している場合(通常はrootとして実行することを意味します)、ユーザースペースメモリーにモジュールを構成してからカーネルにロードし、ユーザースペースのコードにジャンプします。しかし、何をしたいのかを達成するには、これより良い方法があります。

Linuxにはカーネルスレッドという概念があります。カーネルスレッドは、ユーザースペースがないという点でユーザースレッドとは異なります。これらのスレッドは常にカーネルモードになっています。パフォーマンス上の理由から、コンテキスト切り替えはカーネルスレッドに切り替えるときに現在のユーザースペースを保存する可能性があるため、カーネルスレッドがユーザースペースにアクセスしようとすると(エラーになる)、最後に実行中のユーザースレッドのユーザースペースにアクセスします。

Linuxでは、プロセスは、同じユーザースペースを使用するなど、特定のリソースを共有する1つ以上のスレッドグループです。 Linuxは非常に柔軟で、スレッドが共有するリソースと共有しないリソースを選択できます。

おすすめ記事