ユーザースペースが何であるかを正確に知りたいです。私が尋ねた人はみんな「カーネルではなくすべて」と言いました。しかし、それは私には見えません。カーネルがユーザースペースまたはそのような場所でこのドライバを実行できることを読んだときに何が起こるのか想像できません。だから誰かがこれについて私を訂正したら、私は感謝します。
答え1
概念的なレベルでは、カーネルはハードウェア保護の「より高い特権」レベルで実行されるすべてです。これはx86プロセッサのリング0、ARMのシステムモード、MIPSのカーネルモード、68xxxのハイパーバイザーモードなどです。カーネルは通常、ソフトウェア割り込み(システムコール)やハードウェア割り込み(ディスクドライブ、ネットワーク割り込みカード、ハードウェアタイマー)などの割り込み駆動方式です。
同じ概念レベルでは、「ユーザースペース」は最小特権モード(x86 CPUのリング3、ARM、MIPSのユーザーモードなど)で実行されます。ユーザーモードは、カーネルがマイナーなハードウェアの違いを軽減し、すべてのプログラムに同じAPIを提供する方法を利用します。例えば、いくつかの無線カードは、追加の制御レジスタを有しているか、他のカードよりも受信パケットのオンボードバッファが多いか少ないかもしれない。ドライバコードはこれらの違いを考慮し(時には高度な機能や珍しい機能を省略する)、すべてのプログラムに同じソケットAPIを提供します。
一部のプロセッサ(x86、VAX、Alpha AXPなど)には3つ以上のモードがありますが、一般的なUnixアーキテクチャは中間モードを使用しません。
Unix、Linux、または* BSDで実行されるプログラムとプロセスはユーザースペースです。プロセスはプリエンプティブなので、実際にカーネルが実行されているのを見ることはできず、read()
システムコールのリターンやシグナルハンドラの機能の実行などの副作用のみを見ることができます。
特定の質問に答えるために、Unix、Linux、* BSDでは、「ドライバ」は通常、ネットワークカード、ディスクドライブ、グラフィックカードなど、一部のハードウェアの特定の機能を処理する小さなソフトウェアです。ドライバソフトウェアは、ハードウェア割り込みやハードウェアのマッピングされたメモリなどにアクセスできるように、ほぼ常にリング0/ハイパーバイザモード/カーネル空間で実行する必要があります。ドライバは、特定のハードウェア機能を担当し、そのハードウェアをハードウェアの動作に関するカーネルコードの標準化されたまたは既存の視点に合わせる役割を果たします。したがって、ユーザーモードでドライバを実行するには、カーネルがマップされたメモリ、デバイスレジスタ、割り込み、またはその他の特殊機能をユーザーモードプログラムに公開する必要があります。これは、ユーザープログラムに提供される一般的なUnixスタイルのAPIに簡単に適合しない特別な機能がデバイスに必要になる可能性があるため、難しい場合があります。さらに、ユーザー空間プログラムは通常割り込みにすばやく応答しないため、スケジューリングが問題になります。
答え2
ほとんどの最新CPUではコアまたは監督者モードであり、限定的である。ユーザーモデル。これはCPUのハードウェア機能です。 「Userland」は、ユーザーモードで実行されるコードの別の名前です。
これらのモード間の大きな違いの1つは、ほとんどの最新CPUのMMUがこれらのモードで動作する方法です。
MMUを使用すると、カーネルがRAMブロック(またはページ)を並べ替え、RAMの物理的順序とは異なる順序でエンコードされているように見せることができます。罠または"間違って特定のページにアクセスすると、カーネルモードに戻ります。ユーザーモードはMMUの動作を変更することはできず、カーネルモードでのみこれを実行できます。
したがって、MMUを使用すると、カーネルモードコードは、次のようなあらゆる種類の素晴らしいタスクを実行できます。
- ユーザーモードコードにメモリを「配列」または「マッピング」して、そのコードに連続的なRAMがあると考えるようにします。
- プロセスがメモリを使用する前に要求する必要がある動的メモリ管理スキームを実装します。
- 使用しないでくださいメモリを使用している場合は、ユーザープロセスを停止します。
- 使用可能なメモリが不足すると、最も少なく使用されたページがディスクにスワップされ、プロセスがそのページにアクセスしようとすると再スワップされます。
カーネル/ユーザーモードとともに、MMUはマルチタスクオペレーティングシステムの基礎であることがわかります。これらのツールを使用すると、プロセスコンセプトなどのより高いレベルのタスクを処理できるシステムが作成されます。カーネルは各プロセスのページテーブルを維持し、ユーザーモードに切り替え、そのタイムスライスに対してプロセスに制御を与える前にMMUを再プログラムします。プロセスがメモリを取得するなどの操作により、malloc
カーネルはMMUページテーブルを変更できます。
これにより、ユーザーモードはページテーブルに対して何もできず(そしてページテーブルが存在することを知る必要もありません)、メモリが必要な場合呼ぶユーザーモードからカーネルモードに切り替えるカーネルです。 CPU は、次の簡単なメカニズムを提供します。ソフトウェア割り込みこれを行うには、Linuxカーネルには他のより速い方法があります。
この保護はユーザーモードにあるため、カーネルはプロセスがクラッシュしたり制御不能になったりすると、プロセスを停止して自分自身を上書きできます。カーネルモードではこの保護は存在しないため、カーネルの動作が停止し、システム全体の動作が停止します。このような回復不能なエラーがカーネルモードで発生した場合、これをカーネルパニックと呼びます。バラより「カーネルパニック」とは何ですか?もっと学ぶ。
カーネルはユーザーモードでドライバを実行できます
CPUのカーネルまたはスーパーバイザモードは、ユーザーモードがI / Oデバイスに直接アクセスするのを防ぎます。これにはカーネルを呼び出す必要があるという概念です。 Linuxでデバイスと直接通信するコード(カーネルモードで実行されます)は次のとおりです。デバイスドライバ(一種のカーネルモジュールlsmod
、、、insmod
)modprobe
などのコマンドを使用してrmmod
操作できます。
デバイスドライバ(最も簡単な設定でカーネルモードで実行)にバグがあり、RAMの任意の項目を上書きするなど不快な作業を行う場合(そしてカーネルモードになっているため、すべてのRAMに無制限にアクセスして上書きできる)ですか?カーネル自体)。カーネル自体や他のプロセスに何もすることができないように、デバイスドライバをユーザーモードで実行できることをお勧めします。
残念ながら、ユーザーモードからカーネルモード(と呼ばれる)に切り替える場合コンテキストスイッチ)は基本的に各プロセスまたはカーネル自体がCPUの全体的な状態を切り替える必要があるため、遅くなります。したがって、私たちが同意しない2つのことがあります。まさにセキュリティとスピードです。これが議論の通りであり設計点です。
ユーザーモードでできるだけ多くの操作を試みるカーネルを呼び出します。マイクロカーネル、Linuxはその逆です。しっかりと組んで一つになっている。 Linux用のユーザーモードドライバがあり(FUSEを例にとります)、さらに1つもあります。額縁これを許可します。
答え3
Bruceによると、カーネルに提供されるすべてのコードは信頼できるものでなければなりません。カーネルが何らかの形でマルウェアを実行できる場合、ゲームは終了します。ここで、ユーザ実行コードとカーネル実行コードとの間の権限分離が開始される。ユーザーが実行するコードが必ずしも100%悪いわけではありません。カーネルによって直接実行されません。
ユーザー空間プログラムは、APIやロードされたモジュールなどのカーネルの公開部分とのみ対話します。例は次のとおりですiptables
。実際に作業を実行するいくつかのカーネルモジュール(.ko)または「ドライバ」がありますiptables
。ネットワークフィルタリングフレームワーク。コマンドを実行すると、/sbin/iptables
カーネルにロードされたnetfilterモジュールと通信するuserlandコンポーネントが使用されます。これにより、カーネルが誤ってユーザーコードを実行しないように分離できます。
答え4
Unix/Linux オペレーティングシステムの違いは次のとおりです。ユーザースペースそしてカーネル空間。これは、ユーザー空間とカーネルが属する場所の同義語です。
このように理解してください。ユーザー空間で起こるすべてと対話できます。カーネル空間ではそうではありません。デーモン、ライブラリ、アプリケーションはすべてユーザースペースに属します。オペレーティングシステムのカーネルの外で実行されるすべてのコードはユーザースペースに属します。
カーネル空間は、カーネル自体が実行される場所です。ルートもアクセスできない制限された領域です。ただし、rootユーザーはカーネルが提供するインターフェース(procfs、sysfs)を介していくつかのカーネルパラメータを操作できます。
システムメモリは、カーネル空間とユーザ空間の違いを説明する良い例です。ユーザー空間で実行されるデーモンプロセスを実行するには、少しのメモリが必要です。カーネルは、利用可能なすべてのメモリを管理します。デーモンはカーネルからいくつかの「仮想メモリ」を取得しますが、それが物理メモリなのかスワップ空間なのか他のものなのかはわかりません。カーネルは、プロセスがどのようなメモリを取得するかを決定します。メモリ管理はカーネル空間で発生するためです。カーネル空間で起こる他のものには、プロセススケジューリング、プロセス間通信、メモリ保護と管理、システムコールなどがあります。
ユーザーモードとは何ですか?
したがって、ユーザーモードは、オペレーティングシステムリソース(I / O、ネットワーク、メモリ、CPU時間)と対話するときにデーモンが実行する(または実行できる)操作です。これらのリソースはカーネル空間のプロセスでは隠されています。
短い答え:
これはパイロットの飛行機のコックピットです。