簡単なLinuxドライバとMakefile
3269 ワード
http://www.cppblog.com/edog/archive/2013/10/18/203810.aspx
1、ソースプログラム
//hello.c
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を見てください。
PWDはソースファイルhello.cnのディレクトリです。
メーク-C (大文字C) makeはKERNELKUDIRディレクトリに入ってこのディレクトリのMakefileを実行し、PWDディレクトリに戻って自分で書いたMakefileを実行します。
4、端末でメークをする
これでハロー.ko駆動モジュールができます。
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 ハロー.コをアンマウント
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 ハロー.コをアンマウント