三つのカテゴリーにLinuxドライバ:キャラクタデバイス、ブロックデバイス、ネットワークデバイス。
キャラクタデバイスは:同じデバイスは/ devにキャラクタデバイスファイルを介してアクセスアクセスのバイトストリーム、のようにすることができます。
ブロック・デバイス:ブロック単位のアクセスデータによれば、例えば512キロバイトのように、それは下の/ devファイル・システム・ノードを介してアクセスされます。キャラクタ・デバイスとの間の差は、ブロックデバイスがファイルシステムを介してブロック・デバイス上のアクセス内容に一般的にアプリケーション、ファイルシステムをマウントサポートしなければならないキャラクタ・デバイス・インターフェースと同じものを提供することに加えて、異なるインターフェースであるが、ブロック・デバイス・インタフェースのために特別に提供しますむしろ、ブロックデバイスを直接扱うより。
ネットワークデバイスは:動作するファイルノードでの/ devを使用するが、のような別のネットワーク・インターフェースeth0、eth1のにより作動しません。異なる文字やブロックデバイス内のカーネルインターフェースとネットワーク機器、特殊な機能のセット。
運転指令モジュール:
1つのinsmodのロードモジュール
#sudo insmodの./scull.ko
2つのrmmodはアンロードモジュール
3つのlsmodのリスト、現在のカーネルで使われているモジュール、または小切手の/ proc / modulesファイル
すべてのカーネルモジュール4でdepmodスキャン/ LIB /モジュール/ <カーネルバージョン> /ディレクトリ、それによって依存関係/ LIB /モジュール/モジュールカーネルに<カーネルバージョン> /modules.depを生成します
プローブ5のmodprobeでdepmodれるmodules.dep生成とロードされたカーネルモジュールは、モジュール名、モジュールのニーズがinsmodの経路与えられる適切な自動原稿モジュールを見つけるためにのみ与えられています
基本情報6のmodinfo表示モジュールファイル
#sudoのmodinfo scull.ko
カーネルモジュールをコンパイルする方法:
成功しuImageカーネルソースツリーを作る行っすなわち、まず、カーネルソースを取得し、そして後に正常にコンパイルカーネルは、ソースツリーをコンパイルされています。そして、ライトドライバコードの後に、コンパイルされたカーネルのソースツリーには、カーネルを実行するには、この駆動必要がある場合は、モジュールのコードモジュールをコンパイルするMakefileを書くことができます。
ifeq($(KERNELRELEASE)、)
KERNELDIR?= /work/sysbuild/linux-2.6.22.6
PWD:= $(シェルPWD)
$(MAKE)-C $(KERNELDIR)M = $(PWD)モジュール
そうしないと
OBJ-M:= hello.o
ENDIF
実行は作ることができます
ここでコンパイルしたカーネルソースディレクトリツリー:/work/sysbuild/linux-2.6.22.6、モジュールobjがhello.oで、コンパイラはhello.koを生成し、
モジュールの最も簡単な例:
書式#include <linuxの/ init.h>
書式#include <linuxの/ module.h>
MODULE_LICENSE( "デュアルBSD / GPL")。
stataic int型hello_init(無効)
{
printk( "Hello Worldの\ rを\ n" は);
0を返します。
}
静的な無効hello_exit(無効)
{
printk( "さようなら、残酷な世界\ rを\ n" は);
}
module_init(hello_init)。
module_exit(hello_exit)。
ロードモジュールパラメータを渡すことができる場合、#ls / SYS /モジュール/ハロー例えば、/ SYSディレクトリ内のファイルとして表示された変数のモジュールの動作パラメータ間マクロmodule_param(変数名、変数タイプ、権限)を宣言パラメータを使用/パラメータ/ -l
変数の型:短い、USHORT、INT、UINT、長い、ULONG、charp、ブール値
どのように使用するには:
静的な文字* CHP = "test_char_p"。
静的int型NUM = 1;
module_param(NUM、int型、S_IRUGO | S_IWUSR)。
module_param(CHP、charp、S_IRUGO)。
#insmod hello.ko NUM = 3 CHP = "テスト"
モジュールがカーネルに統合されています
1ことを確認してくださいモジュールが正常に動作しています
カーネルの指定されたディレクトリにコピー2のhello.c・モジュール・ファイル、例えば/ドライバ/チャー
3 kconfigを指定されたディレクトリとMakefileを修正します
kconfigを:設定のHELLOトライステート "新こんにちは"
Makefileの:OBJ - $(CONFIG_HELLO)+ = hello.o
図4は、代わりにコンパイルされたモジュールの、カーネルにコンパイルされる選択されたカーネル関数を再構成します
5新しいカーネルを取得するには、カーネルを再コンパイル
統合が成功を確実にするために6テスト新しいカーネル、カーネルモジュール
表示機器システム:
1 Viewシステムキャラクタデバイスドライバ、およびブロックデバイスドライバメジャー番号
#cat / procの/デバイス
2ビュースタートアップ情報システム
#dmesg
3表示デバイスIO物理メモリアドレス
#cat / procの/ IOMEM
4ビュー割り込み番号が使用されています
#cat / procの/割り込み
キャラクタデバイスドライバの経験:
#insmod ./scull.ko
#cat / procの/デバイス| grepのスカル
252スカル
#sudoはmknod scull0 C 252 0
#sudoのchmod 666 scull0
#cat scull0
#sudoエコー検査>> scull0
#cat scull0
積載scull.ko後にデバイスのメジャー番号を探した後、デバイスファイルデバイスを作成する(キャラクタデバイス用のC、0は最初のスレーブ番号を表します)、ファイルの属性操作デバイスを変更