linux最初のドライバモジュールコンパイル


私たちのソースプログラムは簡単なプログラムです.
#include #include MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello little paoniang!!!"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Good morning little paoniang"); } module_init(hello_init); module_exit(hello_exit);
カーネルモジュールをコンパイルする場合、Makefileファイルが次のようになります.
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KDIR :=/lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
default:
          make -C $(KDIR) M=$(PWD) modules
clean:
          make -C $(KDIR) M=$(PWD) clean
endif
KERNELLRELEASEは、カーネルソースコードの最上位のMakefileで定義された変数であり、このMakefileを最初に読み込み実行したときにKERNELLRELEASEは定義されていないので、makeはelseを実行した後の内容を読み込み、makeのターゲットがcleanであればclean操作を直接実行し、その後終了する.makeのターゲットがdefaultの場合、/lib/modules/$(shell uname-r)/buildはカーネルソースコード/usr/src/linuxへのシンボル接続であり、-C$(KDIR)はカーネルソースディレクトリの下にジャンプしてそこのMakefileを読み取ることを示す.M=$(PWD)は、modulesを構築する際にモジュールソースディレクトリに戻り、modulesターゲットがobj-m変数で設定されたモジュールを指定することを示す.カーネルソースディレクトリから戻ると、KERNELLRELEASEが定義され、kbuildもkbuild構文を解析する文を起動し、makeはelseの前の内容を読み取り続けます.elseの前の内容がkbuild構文の文
 
    
 
    
  obj-m := hello.o          hello.ko  。

 
     
 
     

insmod helloを使います.モジュールをロードしますinsmod:error inserting'hello.o':-l invalid moduleformatのようなエラーは、パニックにならないでください.モジュールに問題があるわけではありません.現在実行されているカーネルバージョンがリンクをコンパイルするヘッダファイルバージョンと一致していないので、フォーマットが間違っているという問題があります.この場合、システムカーネルを交換したり、システムバージョンと一致するカーネルソースをダウンロードしてモジュールを再コンパイルしたりすることができます.何の問題もなく、何の情報も印刷されていない場合は、おめでとうございます.カーネルのロードに成功しました.lsmodコマンドを使用して、現在のシステムロードのすべてのモジュールを羅列することができます.リストにhelloが見つかると信じています.なぜ私たちが想像していたように「Hello little paoniang!!!」と印刷されなかったのか疑問に思うかもしれません.ほほほ、これはprintkが印刷内容をあなたの面と向かっての端末に印刷しないためで、モジュールがカーネル状態で実行されていることを知っていて、あなたが直面することができるのはユーザー状態で、カーネル状態の印刷情報はlogあるいはdmesgコマンドを通じて表示する必要があって、印刷結果を見たいならば、最も簡単な方法はdmesgコマンドをたたくことで、あなたはあなたが望んでいる情報を見ることができて、同時に、/var/log/messageというファイルを開いて表示することもできます.最後に、rmmod helloを使用してモジュールをアンインストールします.同様に、dmesgを使用すると印刷された「Good morning little paoniang」が表示されます.
 
    
 
    

PS:ifneq ($(KERNELRELEASE),) ifneq ($(KERNELRELEASE),)       ,
           :makefile:1:***       。