Linuxのドライバ開発1

三つのカテゴリーに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は最初のスレーブ番号を表します)、ファイルの属性操作デバイスを変更



30元記事公開 ウォン称賛21 ビューに14万+を

おすすめ

転載: blog.csdn.net/oushaojun2/article/details/62871412