アプリケーションとの比較カーネルモジュール
詳細については、を参照してくださいLinuxデバイスドライバ学習----ディレクトリ
アプリケーション1.比較カーネルモジュール
カーネルモジュールとアプリケーションの違いの間:
ほとんどの小規模および中規模のアプリケーション最初から最後まで単一のタスクを実行することですが、それはすぐに、初期化関数の後、最後に今後の要求にサービスを提供するために、事前に登録し、そのモジュールのみです。将来のために、そのモジュールの初期化関数(hello_init)タスクは、事前に準備するために機能モジュールを呼び出すことです。モジュールがアンロードされる前に終了機能モジュール(hello_exit)が呼び出されます。
このイベント駆動型プログラミングはやや似ていますが、必ずしもすべてのアプリケーションは、イベント駆動型であり、それぞれのカーネルモジュールは、このようなものです。イベント駆動型プログラミングとカーネルモジュールのもう一つの違いは、アプリケーションを終了すると、リソースまたはその他のクリーンアップ作業に関係なく解放することができるということであるが、exit関数モジュールの初期化機能は、すべて保証するために行わ撤退しなければならないという余分な残留コンテンツありませんシステムインチ
リンク処理は、このように適切なリンクライブラリを使用して、外部参照を解決することができますので、アプリケーションは、それが定義されていない関数を呼び出すことができます。モジュールはカーネルだけにリンクされているので、機能モジュールは、任意のリンク可能なライブラリせずに、カーネルによってエクスポートされた関数のみを呼び出すことができます。そこには機能モジュールのライブラリとリンクされていないので、ソースファイルが含まれていないので、ヘッダファイルは、通常のアプリケーションです。カーネルモジュールは、コア部の機能として使用することができます。最も関連性の高いカーネルヘッダファイルと関連付けられているに保存されているが/ Linuxが含まれ、および/ ASMディレクトリが含まれます。
異なる治療間違った方法アプリケーションとアプリケーションエラーデバッガのカーネルプログラミング区間は、カーネルエラーは、現在のプロセスを強制終了するシステムには影響しない場合でも、問題の原因を追跡するために使用することができます。
メリットモジュールは、モジュール式のドライバの開発サイクルの短縮に役立ちアンロードします。
2.ユーザ空間とカーネル空間
モジュールは、アプリケーションがユーザ空間で実行されている、カーネル空間で実行されます。
最高レベルで動作するUNIXカーネル、すなわち、スーパーユーザー・モードでは、このレベルでは、すべての操作を実行できます。アプリケーションが最低レベル、そのユーザモードで動作している間、プロセッサは、ハードウェアと、メモリへの不正アクセスへの直接アクセスのレベルを制御します。
カーネル空間およびユーザ空間、二つのモードは、異なる優先順位を持っているだけでなく、各モードの説明は、独自のアドレス空間である、独自のメモリマッピングを有する示すだけでなく。
アプリケーションがシステムコールを実行したり、ハードウェア割り込みが保留されている場合、Unixの実行モードは、スペースをカーネルにユーザ空間からの切り替え。カーネルのシステムコールのコードは、操作を実行するために呼び出し元のプロセスのために、プロセスのコンテキストで実行します。だから、すべてのデータは、プロセスのアドレス空間にアクセスすることができます。かかわらず、カーネル・コードおよびプロセス非同期プロセッサのハードウェア割り込み、及びいずれかのプロセスの。
カーネル関数を拡張するためのカーネル空間で実行されているモジュラーコード。その他の機能は、割り込み処理を担当し、システムコールなどのタスクの2種類、実行機能モジュールの一部を実行するためのドライバ。
3.カーネルの同時実行
プログラミングのカーネルとアプリケーションプログラミングの違いプロセスが同時です。ほとんどのアプリケーションは、マルチスレッド・アプリケーションに加えて、通常は順次実行します。起こる多くのことがあるかもしれない、同じ時間:より複雑な環境のカーネルコード、最も単純なカーネルモジュールを動作させるには、に注意を払う必要があります。
カーネルプログラミングは考慮に入れる必要があり、同時問題の原因を:
- Linuxシステムは、通常、複数の並行プロセスを実行していると同時に、ドライバを使用して複数のプロセスが存在してもよいです。
- ほとんどのデバイスは、プロセッサに割り込み、およびハンドラが非同期的に実行し、割り込み、およびドライバが他のタスクを処理しようとしているときに呼び出されることができます。
- また、非同期で実行されている:(コアタイマーなど);一部のソフトウェアの抽象化
- Linuxは、対称型マルチプロセッサ・システム(SMP)上で実行すること、及びドライバを実行しつつ、複数のCPUであってもよいです。
- コアコードLinux2.6もシングルプロセッサシステムの同時実行の問題に類似したマルチプロセッサシステムがあり、プリエンプトされます。
(ドライバを含む)Linuxカーネルのコードがなければなりませんリエントラントこと、および複数のコンテキストで同時に実行できる必要があります。複数のスレッドの実装分離を確実にするカーネルデータ構造、データにアクセスするための共有コード、共有データを回避するために破壊されなければなりません。レースを回避しながら、並行性の問題ドライブを処理することができます。カーネルコードは、コードセグメントは、排他的プロセッサを与えることができると仮定することはできません。
4.現在のプロセス
カーネルモジュールアプリケーションはとして順次実行するが、カーネルまたは特定のプロセスおよび関連の動作のほとんどいないが。カーネルコードは、グローバルアイテム電流にアクセスすることによって、現在のプロセスを得ることができます。
<ASM / current.h>での現在の定義では、構造体task_structへのポインタです。現在実行中のプロセスに現在のポインタ。あなたは、構造体task_structプロセスIDとコマンド名の特定のメンバーにアクセスすることによって、現在のプロセスを印刷することができます。
printk(KERN_INFO "The process is \"%s\" (pid %i)\n",
current->comm, current->pid);
電流> COMMメンバーに格納されているコマンド名が15文字未満を切断、現在のプロセスで実行されるプログラムの基本的なファイル名です。
5.その他の詳細
仮想メモリのレイアウトでのアプリケーション、およびスタックスペースをたくさん持っています。スタックは、歴史と現在のイベントの自動変数関数を呼び出す機能を保存するために使用されます。コアが小さいスタックを有し、それは空間の4096バイトのページサイズであってもよいです。ドライバの機能は、チェーンやスタックと共有全体のカーネル空間を呼び出す必要があります。そのため、大規模な自動変数は、大規模な構造が必要な場合は、電話の際、構造が動的に割り当てられるべきである、と宣言することはできません。
二重のアンダースコア(__)を有するカーネルAPIの関数名は、一般的に基礎となるコンポーネント・インタフェースは、慎重に使用する必要があります。
カーネルコードは浮動小数点演算を実行することはできませんが、浮動小数点演算は、コードをカーネル必要はありません。
詳細については、を参照してくださいLinuxデバイスドライバ学習----ディレクトリ