Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxデバイスドライバ学習(0)-Hello、世界!モジュール

Linuxデバイスドライバ学習(0)-Hello、世界!モジュール

  
 Linuxのデバイスドライバルーチンが遭遇する

最初の研究:

デ>の#include<リナックス/init.h>の#include<リナックス/module.h> MODULE_LICENSE("デュアルBSD /GPL");

静的INT hello_init(ボイド){のprintk(KERN_ALERT"こんにちは、Tekkamanニンジャ\\ N"!); 0を返す;}

静的ボイドhello_exit(ボイド){のprintk(KERN_ALERT"さようなら、Tekkamanニンジャ\\ N愛のLinuxラブARMラブケケデ> !!!!デ> \\ NDE>デ>"デ>デ>デ>デ>);}

module_init(hello_init); module_exit(hello_exit);ド>

私はそれが私の作業ディレクトリにコピーして、簡単なMakefileのファイルを書き込む:

デ>を、KERNELDIR = /ホーム/tekkaman /作業/SBC2440 /のlinux-2.6.22.2#カレントディレクトリをargumentPWDとしてサブ作るに渡されます:= $(シェルPWD)INSTALLDIR = /ホーム/tekkaman /作業/rootfsの/libに/モジュール

CROSS_COMPILE = /ホーム/tekkaman /作業/crosstool-gcc410-k26222 /GCC-4.1.0-のglibc-2.3.2 /アーム-9tdmi-のlinux-gnuの/binに/アーム-9tdmi-のlinux-gnuの-CC = $ (CROSS_COMPILE)GCC

OBJ-M:= hello.o

モジュール:$(MAKE)-C $(KERNELDIR)M = $(PWD)モジュール

modules_install:CP hello.ko $(INSTALLDIR)

クリーンます。rm -rf * .oの*〜コア.depend * cmdを*の.ko * .mod.c .tmp_versions

.PHONY ..モジュールmodules_install cleande>
は、

真実を伝える、より私は、元のMakefileの修正が来る「Linuxデバイスドライバ(第3版)」を参照してください。私は学ぶことを学ぶことですMakefileの、について多くを知りません!

次にmodules_installを行い、モジュールが作ります。

[Tekkaman-忍者のHelloWorld @ルート]#はmodulesmake -C /home/tekkaman/working/SBC2440/linux-2.6.22.2 M = /ホーム/tekkaman /作業/Linuxdriver /のHelloWorld modulesmakeを作る[1]:ディレクトリ `/home/tekkaman/working/SBC2440/linux-2.6.22.2'CC [M] /home/tekkaman/working/Linuxdriver/Helloworld/hello.oBuildingモジュール、段階2.MODPOST 1 modulesCCは/ホーム/tekkaman /作業/Linuxdriver/Helloworld/hello.mod.oLD [M] /home/tekkaman/working/Linuxdriver/Helloworld/hello.komake[1]:ディレクトリ `/home/tekkaman/working/SBC2440/linux-2.6.22.2を残して「[ ,null,null,0],Tekkaman-忍者のHelloWorld @ルート]#は、私の開発ボードで動作#

] Tekkaman-忍者のHelloWorld @ルート[作業/rootfsの/libに/モジュール/modules_installcp hello.ko /ホーム/tekkamanします[ ,null,null,0],Tekkaman2440 @ SBC2440V4] #cd /libに/モジュール/

[Tekkaman2440 @ SBC2440V4] #ls

cs89x0.ko hello.ko p80211.ko prism2_usb.ko

[Tekkaman2440 @ SBC2440V4] #insmod hello.ko

こんにちは、Tekkaman忍者!汚染されていない

こんにちは1376 0

[Tekkaman2440 @ SBC2440V4] #rmmodハロー

[Tekkaman2440 @ SBC2440V4] #lsmod

モジュールサイズ>

さようなら、Tekkaman忍者!

愛のLinux!ラブARM!ラブケケ!

[Tekkaman2440 @ SBC2440V4] #lsmod


汚染されていないが使用するモジュールサイズ

[Tekkaman2440 @ SBC2440V4 ]#

------------------------------------------ --------------------------------------学習体験:(1)ドライブモジュールはカーネル空間で実行されています、任意のランタイムライブラリに依存することはできませんし、モジュールが接続されているので、ドライブを書いている時点での関数のみカーネル関数の一部として呼び出すことができます。アプリケーションの終了時にリソースの解放や、その他のクリーンアップを気にしないが、モジュールのexit関数は、システムが再起動されるいくつかの前に、慎重にそれ以外の場合は、すべての初期化機能が行わ撤退しなければなりません。(2)ドライブモジュールとアプリケーションの重要な違いがあるさ何かがシステムに残されます。複数の動作モード(3)プロセッサ(レベル)
オペレーティングシステムカーネル空間およびユーザ空間デザインに実際にあります。最高と最低レベル:2つのレベルのみを使用しています
Unixライクなオペレーティングシステムでは。 (4)同時処理ドライバに細心の注意を払います。カーネルAPI二重下線(_ _)を有する関数(5)は、典型的には、基礎となるコンポーネント・インタフェースは、注意して使用すべきです。 (6)カーネルコードブ​​ック浮動小数点演算を実現することができません。

(7)のMakefileファイル解析:デ>はOBJ-M:= hello.o我々は自動的にコンパイルするために、そのディレクトリ内のファイルを検索しますhell.cを行い、hell.koという名前のモジュールの構造を表現したいです。デ>場合、デ> hello.o別のソースによって生成される(例えばFILE1.Cデ>として、デ> file2.cde>デ>)、次いで、(次の赤いフォントに注意)に次の追加:デ>。デ>デ>デスタイル="色:RGB(255、1、2);"> hellode>デ>は-objs:= file1.o file2.oを......デ>と、

デ> $(MAKE)-C $(KERNELDIR)M = $(PWD)モジュールを特徴とデ>デ> -C $(KERNELDIR)は、コア上にメイクファイルを保持するカーネルソースの位置を指定します。デ>デ> M = $(PWD)デ>デ>、ソースコード・モジュールは、デ>の位置を指定し、デ>モジュールOBJ-Mのセット変数をターゲティングモジュール。

デ>未定義のシンボル解析モジュール内の公開〜(8)insmodのカーネルシンボルテーブル。公共カーネルシンボルテーブルが必要モジュラードライバグローバルカーネルエントリ(関数と変数のすなわちアドレス)をすべて含みます。 (9)Linuxの使用モジュール積層技術を、我々はモジュールの複数の層に分割することができ、それぞれの層は、開発サイクルを簡素化することにより短縮することができます。

デ> EXPORT_SYMBOL(名); EXPORT_SYMBOL_GPL(名);ド>記号は、部分的にエクスポートされたグローバル変数は、これら2以降、ファイルをブロックする必要があります。このモジュールは以下のマクロを使用して、どこにでも他のモジュールのシンボルを必要とする場合マクロは特別な変数を宣言するように拡張され、変数はグローバルでなければなりません。

(10)コードのすべてのモジュールが2つのヘッダに含まれています。

デ>の#include<リナックス/init.h>の#include<リナックス/module.h>デ>。

(11)すべてのモジュールのコードは、ライセンスを指定するために使用されるべきです。

Copyright © Windowsの知識 All Rights Reserved