[kernel | user]モードでコードが実行されるとはどういう意味ですか?


14

コードがカーネルモードまたはユーザーモードで実行されるとはどういう意味ですか?

回答:


15

カーネルモード

このモードで実行されているプログラムは、基礎となるハードウェアに完全にアクセスできます。任意のCPU命令を実行し、任意のメモリアドレスにアクセスし、基本的に必要なことを実行できます。

このモードで実行されるユーザーモードコードは、OSのAPIを介したハードウェアの変更に制限されます。それはできません直接ハードウェアにアクセスするすべてで

ここで興味深いのは、一般的なアーキテクチャでは、これはOSだけでなくハードウェアを介して実施されることです。特に、x86アーキテクチャに保護リングがあります。

この種の分離の大きな利点は、ユーザーモードで実行しているプログラムがクラッシュした場合、常に致命的とは限らないことです。実際、現代のシステムでは、通常そうではありません。

チェックアウトジェフの過去記事を。それは彼のいつもの良いものです。


3

簡単に言えば、プログラムがどこで時間を費やしているのかがわかります。

より長い答えとして、これを2つのステップで説明します。最初:

1.カーネルモードに入る

あなたが書くすべての通常のコードは、「ユーザーモード」で実行されます。

プログラムはライブラリを使用して、それらの一般的なタスクを実行できます。これはユーザーモードコードでもあります。

ある時点で、プログラムはシステムのコア機能を必要とする場合があります。例えば:

  • ディスクからファイルの内容にアクセスする
  • 空きメモリの一部を予約する
  • Webカメラドライバーからビデオフレームを取得する
  • 画像データをグラフィックカードに送信します。
  • ネットワークパケットを送信します。

ハードウェアに近いこの重要な機能は、カーネルの一部です。これが、コンピューター上のすべての背後にある中心的なプログラムです。プログラムが機能するために必要なすべてを管理します。

カーネルで関数を使用するために、プログラム実行パスは文字通りユーザーモードからカーネルコードにジャンプします。カーネルはそれを行い、実行パスをユーザーモードに戻します。

プログラムがカーネルモードで多くの時間を費やす場合、それは多くの場合、ハードウェア関連のアクティビティを多く実行していることを意味します。たとえば、ディスクシークやビデオストリーミングなどです。ハードウェアが誤動作している可能性もあります。処理が遅くなり、プログラムがカーネル空間で異常な時間を費やすことになります。


2違い

カーネル空間のコードは高性能です。カーネルの他の部分はそれを直接呼び出すことができ、コードは境界チェックなしでシステムのすべてのリソースに直接アクセスできます。カーネル/ユーザーモード間の切り替えも高価な操作であり、すべてをカーネルコードで実行することで完全に回避されます。

ただし、カーネル内には、セキュリティチェック、クラッシュに対する保護、またはメモリの間違った部分への書き込みのための余地があまりありません。これらは、カーネルが他のプログラムに提供できるサービスです。プログラムがだまされて、世界が異なって見える(プログラムは仮想のサンドボックス/制限された環境に住んでいる)と信じるようになります。

カーネル自体は、保護するものが背後にないため、あまり保護できません。それはシステムの心臓部であり、それが停止すると、すべてが終了します。カーネルパニック、またはWindowsでは有名なBSODが発生します。

それはまた、カーネルベースのコードのリスクであり、パフォーマンス要件の低いサブシステムがユーザースペースに移動されている理由です。ただし、基本的なハードウェア関連部分は通常、すぐには変更されないカーネルコードです。


2

現在実行中のコードがさまざまなハードウェアと直接やり取りできるかどうかの違いです。カーネルモードコードは、デバイスバスへの書き込み、メモリマッピングの変更、実行中のプロセスの切り替えなどを行うことができます。ユーザーモードは計算を実行でき、カーネルへのシステムコールを行って、世界中のユーザーと対話できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.