Submit Search
カーネルモジュールプログラミング超入門 #1(仮)
•
Download as ODP, PDF
•
6 likes
•
2,621 views
University of Tsukuba Linux User Group
Follow
筑波大学 Linux User Group (つくらぐ) http://www.tsukuba-linux.org/
Read less
Read more
1 of 24
Download now
Downloaded 38 times
More Related Content
カーネルモジュールプログラミング超入門 #1(仮)
1.
(The Linux)
Kernel Module Programming ...for Dummies #1 Takayuki Horimoto opentaka[at]tsukuba-linux.org http://www.tsukuba-linux.org/
2.
$whoami Takayuki Horimoto
3.
堀本 貴幸
(opentaka)
4.
Gentoo Linux geek
GMN-ja ( もう死んだ ...)
5.
CJK team
目指して bug を潰します Open Source Software != Free Software
6.
Agenda What is
a kernel module?
7.
lsmod ,
insmod and modprobe
8.
“ hello world
” with printk()
9.
Creating a
Makefile
10.
Introduction to
MODULE_*()
11.
Summary
12.
What is a
kernel module? カーネルに load/unload できるバイナリ
13.
“ プラグイン ”のようなもの
14.
機能やドライバを追加できるようになる。
15.
カーネルを config する時に
<M> としたもの。
16.
eg. ipv6, ipfilter,
usblp (USB printer), usb-storage
17.
lsmod ,
insmod and modprobe $ cat /proc/modules loadされているモジュールの一覧。
18.
$ lsmod
で人間が読めるようになる pppoe 9320 2 - Live 0xc0c4d000 0xf8969000 pppox 5226 1 pppoe, Live 0xc0c4b000 0xf896d000 ppp_generic 15328 6 pppoe,pppox, Live 0xc0c47000 0xf8962000 slhc 7802 1 ppp_generic, Live 0xc0c45000 0xf8966000 # insmod /lib/.../ppp_generic.ko モジュールをロードできる。
19.
File Locations モジュールは一体どこに潜んでいるか
? /lib{.,32,64}/modules/<kernel>/kernel/<categ1>/<categ2>/<name>.ko 例 : /lib/modules/2.6.29-gentoo-r5/kernel/drivers/net/s2io.ko # modprobe ppppppppppppoe (p..oe のモジュールをロードする ) /etc/modprobe.conf alias <hogehoge(generic identifier)> p....oe p...oe.ko という意味 /lib/modules/<kernel>/modules.dep 依存関係 p...oe の前に ppppppppp が必要等な場合、 p.. をロードする
20.
# 1 Hello
World
21.
#include < linux/module.h
> #include < linux/kernel.h > int init_module(void){ printk(KERN_INFO "Hello World"); return 0; } void cleanup_module(void){ printk(KERN_INFO "..dying"); } helloworld.c
22.
printk() printk(KERN_INFO
“ お腹空いた ” ); printk(KERN_ WARNING “ もうだめ ... ” );
23.
printk() printf() とほぼ同じ。
printf() : “ printf() は画面に文字を表示させます。” “ ただしワープロソフトで書かないでください ” – やさしいなんとかの本
24.
printk() printk( KERN_INFO
“ お腹空いた ”); printk( KERN_WARNING “ もうだめ ...”); linux/kernel.h[L91]: #define KERN_EMERG "<0>" /* system is unusable */ #define KERN_ALERT "<1>" /* action must be taken immediately */ #define KERN_CRIT "<2>" /* critical conditions */ #define KERN_ERR "<3>" /* error conditions */ #define KERN_WARNING "<4>" /* warning conditions */ #define KERN_NOTICE "<5>" /* normal but significant condition */ #define KERN_INFO "<6>" /* informational */ #define KERN_DEBUG "<7>" /* debug-level messages */
25.
printk() printf() は標準出力に出力するに対して、
printk() はコンソールへ出力することや syslogd にログさせることができる。
26.
KERN_* によって扱いが変わる ログするだけなのか、コンソールへ出力するだけなのか
要するに、 syslog() の ログレベル
27.
/* モジュール作成に必要
*/ #include < linux/module.h > /* KERN_INFO に必要 */ #include < linux/kernel.h > /* load したとき */ int init_module(void){ printk(KERN_INFO "Hello World"); return 0; } /* rmmod したとき */ void cleanup_module(void){ printk(KERN_INFO "..dying"); } helloworld.c
28.
$ make テスト環境は
vanilla* カーネル (*kernel.org のカーネル ) その他のディストリビューションは build-essential みたいなのを emerge しないといけないかもしれない。
29.
$ make Makefile:
obj-m += helloworld.o make します : $ make -C <PATH_TO_THE_KERNEL> M=$(PWD) modules ------------------------------ helloworld.ko ができるので load : # insmod helloworld.ko 用がないので unload : # rmmod helloworld
30.
$ make /var/log/messages
らへんに、 Hello World #insmod した時 ...dying #rmmod した時 と表示されていることでしょう。
31.
終
32.
なわけない
33.
/* モジュール作成に必要
*/ #include < linux/module.h > /* KERN_INFO に必要 */ #include <linux/kernel.h> /* load したとき */ int init_module(void){ printk(KERN_INFO "Hello World"); return 0; } /* rmmod したとき */ void cleanup_module(void){ printk(KERN_INFO "..dying"); } MODULE_*()
34.
MODULE_*() $KERNEL_SRC/include/ linux/module.h
: % cat linux/module.h | grep '#define MODULE_' … #define MODULE_INFO (tag, info) __MODULE_INFO(tag, tag, info) #define MODULE_ALIAS (_alias) MODULE_INFO(alias, _alias) #define MODULE_LICENSE (_license) MODULE_INFO(license, _license) #define MODULE_AUTHOR (_author) MODULE_INFO(author, _author) … …
35.
MODULE_*() $KERNEL_SRC/include/ linux/module.h
: % cat linux/module.h | grep '#define MODULE_' … #define MODULE_INFO (tag, info) __MODULE_INFO(tag, tag, info) #define MODULE_ALIAS (_alias) MODULE_INFO(alias, _alias) #define MODULE_LICENSE (_license) MODULE_INFO(license, _license) #define MODULE_AUTHOR (_author) MODULE_INFO(author, _author) … Doesn't look that hard to implement MODULE_*() to helloworld.c ...
36.
/* モジュール作成に必要
*/ #include < linux/module.h > /* KERN_INFO に必要 */ #include < linux/kernel.h > MODULE_LICENSE(“GPL”); MODULE_AUTHOR(“TsukuLUG”); /* load したとき */ int init_module(void){ printk(KERN_INFO "Hello World"); return 0; } /* rmmod したとき */ void cleanup_module(void){ printk(KERN_INFO "..dying"); } helloworld.c
37.
最後に 簡略化するため、 Kbuild
については何も触れませんでした。
38.
module_init() 及び
module_exit() についても触れませんでした。
39.
helloworld が syslog()
されたら幸せになれます。 Icons: http://www.iconlook.com/
40.
ご清聴ありがとうございました。 筑波大学
Linux User Group Twitter: @tsukuba_linux http://www.tsukuba-linux.org/
Download