簡単なLinuxドライバとMakefile

3269 ワード

http://www.cppblog.com/edog/archive/2013/10/18/203810.aspx
1、ソースプログラム
//hello.c
#include <linux/init.h>   
#include <linux/module.h>   

MODULE_LICENSE("Dual BSD/GPL");  
static int hello_init(void)  
{  
    printk(KERN_ALERT "hello module!
"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "bye module!
"); } module_init(hello_init); module_exit(hello_exit);
 
2、ドライバの紹介
linuxカーネルモジュールの一つは主に以下のいくつかの部分から構成されています。
(1)moduleローディング関数。
 
insmoduleまたはmodprobe命令によりカーネルmoduleをロードすると、moduleのローディング関数が自動的にカーネルによって実行され、本moduleの関連初期化が完了します。
 
moduleアドイン関数はmodule_を経由します。init()関数はカーネルに登録されます。
 
(2)moduleアンインストール機能。
 
rmmodコマンドがあるモジュールをアンインストールすると、モジュールのアンインストール機能が自動的にカーネルによって実行され、このモジュールの初期化の逆機能が完了します。
 
moduleアンインストール機能はmodule_を経由します。exit()関数はカーネルに登録されます。
 
(3)module許諾声明(必須)
 
ライセンスのlicense声明はカーネルモジュールのライセンス権限を記述しています。もしlicenseを宣言しないと、モジュールがロードされた時、カーネルが汚染されていると警告されます。linuxで受け入れられるlicenseには「GPL」「GPL v 2」「Dual BSD/GPL」「Dual MPL/GPL」などがあります。
 
多くの場合、カーネルモジュールはGPL互換許可権を遵守しなければならず、2.6カーネルモジュールはMODULE_で最も一般的である。LICENSE(「Dual BSD/GPL」)ステートメントモジュールにはBSD/GPLが採用されています。 双LICENSE
 
(4)モジュールパラメータ(オプション)
 
(5)モジュールの随所記号(オプション)
 
(6)モジュール作成者等の情報声明(オプション)、MODULE AUTHOR()、MODULE DESCRIPTION()、MODULE ALIAS()など。
 
ハロー.koをコンパイルして、insmood hello.koローディングモジュール、rmmod hello.ko モジュールをアンマウントします
 
 
linuxカーネルの全体的な構造はすでに非常に巨大であり、その中に含まれるコンポーネントも非常に多く、必要な部分をカーネルに含める二つの方法があります。
 
一つは,すべての機能をカーネルにコンパイルしたが,今回は二つの問題を引き起こし,生成されたカーネルは特別にヒットし,現在のカーネルを増やしたり削除したりすれば,カーネル全体を再コンパイルしなければならない。
 
モジュールmoduleを使って、上記の一番簡単なドライバはモジュールmoduleです。任意に増やしたり、削除したりできます。
 
3、Makefileファイル
どのようにhelo.koカーネルモジュールにhello.cソースファイルをコンパイルしますか?同じmakeを使っていますが、ここのMakefileは一般のアプリケーションMakefileとは違っています。Makfileを駆動するにはカーネルソースコードの位置を指定します。まず簡単なドライバMakefileを見てください。
obj-m := hello.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

all:
	make -C $(KERNEL_DIR)  M=$(PWD) modules

clean:
	rm *.o *.ko *.mod.c
KERNELUDIRはカーネルソースコードbuildディレクトリであることを知っています。カーネルは/usr/srcに保存されています。/lib/modulesは実はこの場所に接続されています。shellでuname-rを実行すれば使用中のカーネルバージョン番号が得られます。このように適切なカーネルソースを選択しました。
PWDはソースファイルhello.cnのディレクトリです。
メーク-C (大文字C) makeはKERNELKUDIRディレクトリに入ってこのディレクトリのMakefileを実行し、PWDディレクトリに戻って自分で書いたMakefileを実行します。
4、端末でメークをする
これでハロー.ko駆動モジュールができます。
# make
make -C /lib/modules/2.6.32-38-generic/build  M=/home/xxx/test/msg/drv modules
make[1]:        `/usr/src/linux-headers-2.6.32-38-generic'
  CC [M]  /home/xxx/test/msg/drv/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/xxx/test/msg/drv/hello.mod.o
  LD [M]  /home/xxx/test/msg/drv/hello.ko
make[1]:       `/usr/src/linux-headers-2.6.32-38-generic'
5、insmaodロード
1.      [root@localhost driver.⑵ insmood ハロー.ko
6、lsmodモジュールを見る
lsmodはハローモジュールの存在をすぐに見ます。そしてシステムのログ/var/logs/messagesにモジュールの出力を記録します。
printk(KERNUALERT) ハロー module!");  
出力のハローmodule!
   プロジェクト 13 11:27:07 local host ケネル: ハロー module 
7、rmmod helle ハロー.コをアンマウント