Hello World †
ほぼ何もしない "Hello World" プログラムを作って Linux Kernel に組み込む単純なモジュールの作り方を見ていきます。まだ、デバイスドライバには遠いです。
ソースコード †
添付ファイル に一式をまとめておきます。C 言語で実行部を、Makefile で構築手順を書きます。Makefile を書かずにコンパイルできるかというと、自分では試したことがないです。煩雑な記述をした割には得るものが無いでしょう。
実行部 †
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
-
|
|
|
!
-
|
!
-
|
|
!
-
!
| #include <linux/kernel.h>
#include <linux/module.h>
static int __init hello_world_init(void)
{ printk(KERN_INFO "%s: Hello world.\n", __func__);
return 0;
}
static void __exit hello_world_exit(void)
{ printk(KERN_INFO "%s: Goodbye world.\n", __func__);
}
module_init(hello_world_init);
module_exit(hello_world_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Tutorial hello world.");
MODULE_AUTHOR("Your name or email address.");
|
Makefile †
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| -
|
|
|
|
|
|
|
|
|
!
-
!
-
|
| KERNEL_SOURCE_TREE:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
obj-m:=hello_world.o
.PHONY: modules clean # install
modules:
make -C $(KERNEL_SOURCE_TREE) M=$(PWD) modules
clean:
make -C $(KERNEL_SOURCE_TREE) M=$(PWD) clean
|
userland アプリ・ケーションと違うところ †
module_init, module_exit †
main() はありません。モジュールは Kernel に組み込まれる時 module_init() で指定した関数を実行します。モジュールが Kernel から外されるとき module_exit() で指定した関数を実行します。
printk †
printf に相当する関数です。書式文字列を指定して変数内容を表示します。
Linux Kernel に動的に組み込むモジュールとして作成する †
Makefile を書く †
Linux Kernel に組み込む †
何も起きない? dmesg で確かめよう †
printk は何処と結合しているの? †
多重に組み込めない †
Hello Friend †
パラメータを入力する †
エラーを返してみよう †