コードがカーネルまたはユーザーモードで実行されることはどういう意味ですか?
答え1
カーネルモード
このモードで実行されるプログラムは、基本ハードウェアへのフルアクセス権を持ちます。すべてのCPU命令を実行し、すべてのメモリアドレスにアクセスし、デフォルトで必要なすべての操作を実行できます。
ユーザーモード このモードで実行されるコードは、オペレーティングシステムのAPIを介したハードウェアの変更に制限されます。それできないハードウェアに直接アクセス別の言葉。
興味深いことに、一般的なアーキテクチャでは、これはオペレーティングシステムだけでなくハードウェアによっても実施されます。特に、x86 アーキテクチャ持つ保護リング。
これらの分離の最大の利点は、ユーザーモードで実行されている間にプログラムがクラッシュしても常に致命的ではないことです。実際、現代のシステムでは通常いいえ。
確認するジェフの受け入れてください。これは彼のいつも良いことです。
答え2
短い答えは次のとおりです。プログラムが時間を費やす場所だけを教えてくれます。
より長い答えのために2つのステップで説明します。最初:
1. カーネルモードに入る
あなたが書くすべての一般的なコードは「ユーザーモード」で実行されます。
プログラムはライブラリを使用して一般的な操作を実行できます。これはユーザーモードコードでもあります。
ある時点では、プログラムにシステムの重要な機能が必要な場合があります。たとえば、
- ディスクからファイルコンテンツにアクセスする
- 空きメモリ予約
- Webカメラドライバからビデオフレームを取得する
- 画像データをグラフィックカードに送信します。
- ネットワークパケットを送信します。
このデフォルト(ハードウェアに近い)機能はカーネルの一部です。これはコンピュータのすべての背後にある中央プログラムです。プログラムの実行に必要なすべてを管理します。
カーネルの機能を使用するために、プログラム実行パスは実際にはユーザーモードでカーネルコードにジャンプします。カーネルはタスクを完了し、実行パスをユーザーモードに戻します。
プログラムがカーネルモードで多くの時間を費やすということは、一般的にハードウェア関連の活動を多く実行していることを意味します。たとえば、ディスク検索やビデオストリーミングなどがあります。ハードウェアが誤動作する可能性があり、これにより処理が遅くなり、プログラムがカーネル空間で異常に多くの時間を費やします。
2つの違い
カーネル空間のコードはパフォーマンスに優れています。カーネルの他の部分ではそれを直接呼び出すことができ、コードは境界チェックなしでシステム内のすべてのリソースに直接アクセスできます。カーネル/ユーザーモードを切り替えることも高価な作業なので、カーネルコードですべてを実行すると完全に回避できます。
しかし、カーネルの内部には安全チェックを行ったり、衝突を防止したり、メモリの間違った部分に書き込むスペースがあまりありません。これはカーネルが他のプログラムに提供できるサービスです。これは、プログラムが世界が異なって見えると信じるようにだますので、プログラムは仮想サンドボックス/制限された環境にあります。
カーネル自体にはカーネルを保護するものがないため、多くの保護を提供しません。それはシステムの中核であり、それが止まるとすべてが終わります。カーネルパニックが発生するか、Windowsでは有名なBSODが発生します。
これはカーネルベースのコードのリスクであり、パフォーマンス要件が低いより多くのサブシステムがユーザースペースに移動する理由でもあります。しかし、ハードウェアに関連する基本的な部分は通常カーネルコードなので、すぐに変更されません。
答え3
違いは、現在実行中のコードがさまざまなハードウェアと直接対話できるかどうかです。カーネルモードコードは、デバイスバスへの書き込み、メモリマップの変更、実行中のプロセス切り替えなどを実行できます。ユーザーモードは、計算を実行し、カーネルへのシステムコールを実行することで、残りの世界と対話することができます。