Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxドライバー開発の詳細

Linuxドライバー開発の詳細

  
                  

最初のカーネルモジュール(Hello Worldモジュール)

コードは次のとおりです。コードの表示#include< linux /init.h>#include< linux /module.h> MODULE_LICENSE(" Dual BSD /GPL");); static __init int hello_init(void){//printk関数はモジュール用にカーネル内で定義されています。カーネルは独自に実行されるため、独自のprint stats //が必要です。対応するライブラリ関数はありません。 //insmodがロードされ、カーネルが呼び出し可能カーネルのパブリックシンボルにリンクされているため、//モジュールはprintkを呼び出すことができます//KERN_ALERTはメッセージprintkの優先順位です(KERN_ALERT" HELLO WORLD \\ n")return 0; static __exit void hello_exit(void){printk(KERN_ALERT" GoodBye \\ n");} module_init(hello_init); module_exit(hello_exit);

このモジュールでは2つの関数が定義されています。1つはモジュールにロードされます。モジュールがカーネルから削除されると、カーネル呼び出し(hello_init)とその他の呼び出し(hello_exit)、上記のコードのmodule_initとmodule_exitは、カーネルに開始位置と終了位置を指示する2つのカーネルマクロ定義、MODULE_LICENSEです。このマクロは、モジュールがフリーライセンスに準拠していることを宣言するために使用されます。そうでなければ、カーネルのロード時に警告が表示されます。さて、あなたはそれに応じて上記のプログラムをテストすることができますテストの前に対応するMakefileを書かなければなりませんモジュールのコンパイルは通常のプログラムのコンパイルとは異なります。

Makefile

コードは次のとおりです。コードを表示#こんにちは世界のmakefile#KERNELRELEASEは、カーネルのソースコードで定義されている最初の変数です。ifneq($(KERNELRELEASE)、)#変数が空かどうか(最初の実行時には定義されません) elseステートメントを実行obj-m:= HelloWorld.o#は、ディレクトリファイルHelloWorld.oから作成するモジュールがあることを示し、作成した後に、#HelloWorld.koという名前を付けます。ソースファイルは、file1.cとfile2.c#がobj-m:= module.o#module-objs:= file1.o file2.oのようになっていると仮定します。それ以外の場合KDIR:= /lib /modules /$(shell uname - r)/build all:#makeのターゲットがすべての場合、-C $(KDIR)はカーネルのソースディレクトリにジャンプしてMakefile #M = $(PWD)を読み取り、現在のディレクトリに戻って読み取りを続け、現在のMakefileを実行します。再度実行すると#$(KERNELRELEASE)が定義されているので、makeは他のものより先に読みます。 -C $(KDIR)M = $(PWD)モジュールをクリーンにします。rm -rf * .ko * .o * .mod.o * .mod.c * .symvers endif

対応する説明は上記のとおりです。 compiledコンパイルされたカーネルとして開く:スーパーユーザーである必要があります。現在のパスにmakeを入力し、カーネルをロードするためにinsmd HelloWorld.koと入力します。 Tailはカーネルの出力情報を見ることができます。 rmmod HelloWorldを使用してカーネルを削除し、dmesg

Copyright © Windowsの知識 All Rights Reserved