情報インタラクション

  
のためのLinuxカーネル空間およびユーザ空間

概要:システムレベルのデバイスドライバを実行し、カーネル関数モジュールの開発は、一般に、カーネルとユーザプログラムとの間の情報の交換を必要とします。 Linuxは、これらのタスクを達成するために使用することができる様々な方法を提供します。この記事では、情報交換の一般的な方法を要約して、自分の特徴や使い方の簡単な例でこれらのメソッドを示しています。そのうち、私たちは非常に方法に精通するだけでなく、特殊な条件で使用される手段です。 Linuxカーネルの理解を深めることができ、これらの方法は明確である比較することで、より重要なことは、私たちは、Linuxカーネルレベルを制御する、より巧みなアプリケーション開発技術にすることができます。


カーネル空間(カーネル空間)ユーザ空間(ユーザー空間)VS Linuxの開発者として、すべての最初には、明確なカーネル空間とユーザ空間の違いでなければなりません。このトピックでは、関連する多くの情報がありました、私たちはここに簡単にされている次のように述べた:

現代のコンピュータアーキテクチャ、メモリ管理は、通常、保護メカニズムが含まれています。保護を提供する目的は、タスク別のシステムに属しているか、
オペレーティングシステムのメモリ領域に属するへのアクセスを防止することです。 IntelX86システムとして、それは特権レベルを区別することによって、記憶領域へのアクセスを制限するために、特権階級にこの保護メカニズムを提供します。このフレームワークに基づき、Linuxの
オペレーティングシステム自体が分割されている:通常のコア・ソフトウェア・アプリケーションとは独立の一部を、より高い特権レベルで実行し、(Linuxのインテルシステム・レベルの権限が3のカーネルを実行するには。)彼らはすべての権利は、ハードウェアデバイスへのアクセスを持っているために、保護されるようにメモリ空間内に存在し、Linuxのカーネルは、このスペースと呼ばれます。
は、

これとは対照的に、他の部分は、ユーザ空間アプリケーションプログラムとして実行されます。彼らは唯一のシステムの一部は、彼らが使用するリソースを可能にし、特定のシステム機能を使用することができない、ハードウェアに直接アクセスすることはできません、直接カーネル空間にアクセスすることはできません、もちろん、他の特定の使用制限があります見ることができます。 (Linuxのプログラムを実行するために、特権レベル0インテル・システム・ユーザーを使用して。)

など非対称アクセス機構の下に置かれ、ユーザ空間とカーネル空間のセキュリティの観点から非常に有効である、それは悪意のあるユーザーに耐えることができますスパイ、だけでなく、システムの実行がより安定した信頼性の高い作り、ユーザプログラムの品質不良に対する予防します。このような何かが完全にユーザーがアクセスし、リソースにカーネル空間を使用することを許可されていない場合は、その後、私たちのシステムは、任意の意味のある機能を提供することはありません。完全にハードウェアアーキテクチャ自体からオペレーティング・システムに、特権の上記規定に違反することなく、制御されるカーネル空間プログラム内のリソースの使用を容易にするために、標準アクセスインタフェースを定義します。ドア'メカニズムX86システムの詳細は、参考1

一般的なハードウェアシステムの機関は&'を提供参照してください。 &Ldquoは、ドア'ドア&'を;高カーネル空間の特権に意味が低特権アプリケーションは、これらの&'を渡すことができたときに発生する特定のイベントを指します。システム・ゲート' IntelX86システムは、Linuxオペレーティングシステムは、の&'使用されている(int型$ 0x80のマシン命令を呼び出すことによって)このハードウェア・インターフェース、システムのすべての種類がへのユーザーへのアプリケーションのフォームのためのソフトウェア・インターフェースとして呼び出す構築カーネルモードのチャネルを提供します。 &'、システムゲート'&'を使用して、システムコール&'特別な権限を必要とするが、カーネルの特定の位置に該当しないことにより、この位置は、ランダムではない'システム&'呼び出し、指定し、そのような制限のためカーネルが安全であることを確認してください。私たちは、鮮やかに、このメカニズムを記述することができます訪問者として、あなたはチケットを買うことができるとSafariに行ってきましたが、あなたは正直観光ルートの規定に基づき、観光ボードに座っています。それはあなたが彼の人生を捨てる作ることではない、あまりにも危険であるので、もちろん、それは野生動物のあなたが怖がっようにすることです、下車することはできません。

効率とコードサイズの考慮事項については、カーネルは標準ライブラリ関数を使用することはできません(もちろん、他の懸念がありますが、詳細な理由の文献を参照してください。2)、したがって、カーネルの開発と同様に良好ではないので、便利なユーザプログラム開発。そして、電流(正式にリリースされていないlinux2.6)にカーネルがある'ノンプリエンプティブ',プロセスは、このようなコールとして、カーネル空間で実行されているプロセスは、CPUの制御を放棄しない限り、(他のプロセスによって置き換えられませんので、睡眠()、スケジュール()など)、それは、そのようなreadシステムコールを実行しているとして、プロセスコンテキスト()で、または割り込みコンテキストである(割り込みサービスルーチンである)、カーネルはCPUの占有、または他のプログラムを延長することができません実行されることはありません、我々は待つことができます。

インタラクションのカーネル空間とユーザースペース今、より多くのアプリケーションが一緒に特定のタスクを達成するためにカーネルレベルとユーザーレベルのプログラムを書く必要があり、通常は次のパターン:まず、カーネルサービスプログラムを書きます受信、処理及びキャッシュデータのために提供カーネル空間内の権利とサービスを使用し、その後、以前に完了したプログラムが対話するユーザプログラムとカーネルのサービスを書き、具体的には、ユーザーは、カーネルのサービスプログラムのパラメータを設定するカーネルサービスプログラムを抽出するためのプログラムを使用することができますまた、データを入力することができますもちろん、提供されたデータは、コアサービス・ルーチンに処理します。

典型的なアプリケーションが含まれます:Netfilterの(カーネルサービスプログラム:ファイアウォール)VSのiptable(ユーザレベルのプログラム:ルール設定)、IPSEC(カーネルサービスルーチン:VPNプロトコルの一部)VS IKE(ユーザレベルのプログラム:VPNを鍵交渉プロセス);もちろん、デバイスドライバ及びアプリケーションソフトウェア適切な多数。これらのアプリケーションは、カーネルとユーザレベル手順によって特定のタスクの完了と情報を交換することです。

メソッドのユーザーとカーネルの情報交換を交換する情報は、両方があなたにもスペースをカーネルにユーザ空間からデータを送信することができ、スペースをカーネルにユーザ空間からの情報を送信するためのイニシアチブを取ることができることを意味し、双方向です。もちろん、ユーザプログラムを積極的にカーネルデータから抽出することができます。ここでは、要約、カーネルとユーザインタラクションデータのための方法の概要を行います。情報伝達によって

の情報交換は、カーネル/カーネル抽出データへの転送を開始するユーザーに分け、二つのカテゴリーにユーザ空間へのリクエストを送信、最初の点であることができる:ユーザーレベル情報交換プログラムを積極的に開始しました。

ユーザーレベルのプログラムは、システムは、ユーザ・レベルのプログラムはカーネルにアクセスするための最も基本的な方法で呼び出して、情報交換Aは、独自のシステムコールは、上記から分かるように、書き込みが開始されます。 Linuxは現在、(カーネルのソースツリー/i386の/カーネル/entry.Sファイルを参照してください/ASM-i386のunistd.h /アーチを含む)に大別オーバー200回の標準的なシステムコールを提供し、私たちは、独自のシステムコールを追加することができますそして、の情報交換を実現するためにカーネル。例えば、我々はシステムコールのロギングシステムを確立したい、システムは、侵入検知のために記録されたすべてのアクションを呼び出します。この時点で、我々はカーネルのサービスプログラムを書くことができます。プログラムは、すべてのシステムコールを要求し、自作のカーネルバッファレーン内に通話情報を記録を収集する責任があります。私たちは、ユーザ空間にバッファ内のレコードを抽出する必要がある、カーネルに複雑な侵入検知プログラムを実装することはできません。最も簡単な方法は、自分自身、この抽出データ・バッファリング機能を実現するための新しいシステムコールを書くことです。カーネルサービスプログラムと新しいシステムコールが実現されている場合、我々はユーザプログラムの侵入検出タスクのユーザ空間を書くことができ、侵入検出プログラムは、回転中に、タイムアウトすることができたり、その後、必要なときに抽出されたコアから新しいシステムコールのデータを呼び出します侵入検知。

Bは、Linux /UNIXは、(すべてのものがファイルである)ファイルとして見られているすべてのものの特徴であるドライバを書くこと。システムは、クライアントはこのインタフェースと、カーネルドライバを介して相互作用する均一な方法を使用することができ、簡単なサウンドドライバインタフェースを定義します。そして、システムのユーザーと開発者のほとんどは、すでにこのインターフェースと対応する開発プロセスに精通しています。

ドライバがカーネル空間で実行し、ファイルシステムを介してユーザスペースのアプリケーションファイルは/dev /ディレクトリの下に、それと対話します。 (オープン)——読んで()——書き込み()——のioctl()——近い():これは、我々がその文書の操作手順に精通しているものです。 (()の概念)(オープン・クローズがあるが、同じようなソケットプログラミングとして、大きくないのネット​​ワークドライバとプロトコルスタックのさまざまな方法を使って、すべてのカーネルドライバがインタフェースであることに注意してください、それカーネルの実装との両方の外部と普通のドライバーは非常に異なっています。)この内容をプログラミング、参照3,4を参照してください。

Copyright © Windowsの知識 All Rights Reserved