ユーザーランドが正確に何なのか理解しようとしています。私が尋ねると皆が「カーネル以外のもの」と言いますが、私には具体的ではありません。カーネルがユーザーランドでそのドライバーを実行できるとか、そういうことを読んだのですが、何が起こるのか全く想像がつきません。ですから、この点について誰かが私に正しいことを教えてくれるとありがたいです。
答え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 のハードウェア機能です。「ユーザーランド」は、ユーザー モードで実行されるコードの別名です。
モード間の大きな違いの 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を参照してください)。フレームワークそれがそれを可能にします。
答え3
ブルース氏の発言を踏まえると、カーネルに提供されるすべてのコードは信頼できなければなりません。カーネルによって悪意のあるコードが実行される可能性がある場合、ゲームオーバーです。ここで、ユーザーが実行するコードとカーネルが実行するコードの権限分離が役立ちます。ユーザーが実行するコードは、必ずしも 100% 悪意がない必要はありません。カーネルによって直接実行されるわけではありません。
ユーザランドプログラムは、APIやロードされたモジュールなど、カーネルの公開された部分とやり取りするだけです。例としては、がありますiptables
。実際に の作業を行うカーネルモジュール(.ko)または「ドライバー」がいくつかありiptables
、それらはネットフィルターフレームワークを使用してコマンドを実行すると、/sbin/iptables
ユーザーランド コンポーネントが使用され、カーネルにロードされている netfilter モジュールと通信します。これにより、ユーザー コードがカーネルによって誤って実行されることがないように分離できます。
答え4
Unix/Linuxオペレーティングシステムでは、ユーザースペースそしてカーネル空間これらは、ユーザーランドとカーネルが属する場所の同義語にすぎません。
次のように理解できます。ユーザー空間で行われるすべてのことと対話できます。カーネル空間ではそうではありません。デーモン、ライブラリ、アプリケーションはユーザー空間に属します。オペレーティング システムのカーネルの外部で実行されるすべてのコードは、ユーザー空間 (ユーザーランド) に属します。
カーネル空間はカーネル自体が実行される場所です。これは root でさえアクセスできない制限された領域です。ただし、root ユーザーはカーネルによって提供されるインターフェース (procfs、sysfs) によっていくつかのカーネル パラメータを操作できます。
システム メモリは、カーネルとユーザー空間の違いを説明するのに良い例です。デーモン (ユーザー空間で実行される) は、実行するためにメモリを必要とします。カーネルは、使用可能なすべてのメモリを管理します。デーモンはカーネルから「仮想メモリ」を取得しますが、デーモンはそれが物理メモリなのか、スワップ スペースなのか、その他のメモリなのかを認識していません。プロセスが取得するメモリの種類を決定するのはカーネルです。メモリ管理はカーネル空間で行われるためです。カーネル空間で行われるその他の処理には、プロセス スケジューリング、プロセス間通信、メモリ保護と管理、システム コールなどがあります。
ユーザーランドとは何でしょうか?
つまり、ユーザーランドとは、デーモンがオペレーティング システムのリソース (I/O、ネットワーク、メモリ、CPU 時間) とやりとりするときに実行する (または実行できる) ことです。これらのリソースは、カーネル空間のプロセスからは隠されています。
短い答え:
それはパイロットにとっての飛行機のコックピットのようなものです。