(The Linux)   Kernel Module Programming ...for  Dummies   #1 Takayuki Horimoto opentaka[at]tsukuba-linux.org http://www.ts...
$whoami <ul><li>Takayuki Horimoto
堀本 貴幸  (opentaka)
Gentoo Linux geek </li><ul><li>GMN-ja ( もう死んだ ...)
CJK team  目指して bug を潰します </li></ul><li>Open Source Software != Free Software </li></ul>
Agenda <ul><li>What is a  kernel module?
lsmod ,  insmod   and  modprobe
“ hello world ” with  printk()
Creating a  Makefile
Introduction to  MODULE_*()
Summary </li></ul>
What is a kernel module? <ul><li>カーネルに load/unload できるバイナリ
“ プラグイン ”のようなもの
機能やドライバを追加できるようになる。
カーネルを config する時に <M> としたもの。
eg. ipv6, ipfilter, usblp (USB printer), usb-storage </li></ul>
lsmod ,  insmod  and  modprobe <ul><li>$  cat /proc/modules </li><ul><li>loadされているモジュールの一覧。
$  lsmod で人間が読めるようになる </li></ul></ul>pppoe 9320 2 - Live 0xc0c4d000 0xf8969000 pppox 5226 1 pppoe, Live 0xc0c4b000 0xf896d...
File Locations モジュールは一体どこに潜んでいるか ? <ul><li>/lib{.,32,64}/modules/<kernel>/kernel/<categ1>/<categ2>/<name>.ko </li><ul><li>...
# 1 Hello World
#include < linux/module.h > #include < linux/kernel.h > int init_module(void){ printk(KERN_INFO &quot;Hello World
&quot;);...
printk() printk(KERN_INFO  “ お腹空いた 
 ” ); printk(KERN_ WARNING   “ もうだめ ...
 ” );
printk() <ul>printf() とほぼ同じ。 </ul>printf() : “ printf() は画面に文字を表示させます。” “ ただしワープロソフトで書かないでください ” –  やさしいなんとかの本
printk() <ul>printk( KERN_INFO  “ お腹空いた 
”); </ul>printk( KERN_WARNING  “ もうだめ ...
”); linux/kernel.h[L91]: #define  KERN_...
Upcoming SlideShare
Loading in...5
×

カーネルモジュールプログラミング超入門 #1(仮)

5,056
-1

Published on

筑波大学 Linux User Group (つくらぐ)
http://www.tsukuba-linux.org/

Published in: Education
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,056
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
36
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

カーネルモジュールプログラミング超入門 #1(仮)

  1. 1. (The Linux) Kernel Module Programming ...for Dummies #1 Takayuki Horimoto opentaka[at]tsukuba-linux.org http://www.tsukuba-linux.org/
  2. 2. $whoami <ul><li>Takayuki Horimoto
  3. 3. 堀本 貴幸 (opentaka)
  4. 4. Gentoo Linux geek </li><ul><li>GMN-ja ( もう死んだ ...)
  5. 5. CJK team 目指して bug を潰します </li></ul><li>Open Source Software != Free Software </li></ul>
  6. 6. Agenda <ul><li>What is a kernel module?
  7. 7. lsmod , insmod and modprobe
  8. 8. “ hello world ” with printk()
  9. 9. Creating a Makefile
  10. 10. Introduction to MODULE_*()
  11. 11. Summary </li></ul>
  12. 12. What is a kernel module? <ul><li>カーネルに load/unload できるバイナリ
  13. 13. “ プラグイン ”のようなもの
  14. 14. 機能やドライバを追加できるようになる。
  15. 15. カーネルを config する時に <M> としたもの。
  16. 16. eg. ipv6, ipfilter, usblp (USB printer), usb-storage </li></ul>
  17. 17. lsmod , insmod and modprobe <ul><li>$ cat /proc/modules </li><ul><li>loadされているモジュールの一覧。
  18. 18. $ lsmod で人間が読めるようになる </li></ul></ul>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 <ul><li># insmod /lib/.../ppp_generic.ko </li><ul><li>モジュールをロードできる。 </li></ul></ul>
  19. 19. File Locations モジュールは一体どこに潜んでいるか ? <ul><li>/lib{.,32,64}/modules/<kernel>/kernel/<categ1>/<categ2>/<name>.ko </li><ul><li>例 : /lib/modules/2.6.29-gentoo-r5/kernel/drivers/net/s2io.ko </li></ul><li># modprobe ppppppppppppoe (p..oe のモジュールをロードする ) </li><ul><li>/etc/modprobe.conf </li><ul><li>alias <hogehoge(generic identifier)> p....oe </li><ul><li>p...oe.ko という意味 </li></ul></ul><li>/lib/modules/<kernel>/modules.dep </li><ul><li>依存関係 </li><ul><li>p...oe の前に ppppppppp が必要等な場合、 p.. をロードする </li></ul></ul></ul></ul>
  20. 20. # 1 Hello World
  21. 21. #include < linux/module.h > #include < linux/kernel.h > int init_module(void){ printk(KERN_INFO &quot;Hello World &quot;); return 0; } void cleanup_module(void){ printk(KERN_INFO &quot;..dying &quot;); } helloworld.c
  22. 22. printk() printk(KERN_INFO “ お腹空いた ” ); printk(KERN_ WARNING “ もうだめ ... ” );
  23. 23. printk() <ul>printf() とほぼ同じ。 </ul>printf() : “ printf() は画面に文字を表示させます。” “ ただしワープロソフトで書かないでください ” – やさしいなんとかの本
  24. 24. printk() <ul>printk( KERN_INFO “ お腹空いた ”); </ul>printk( KERN_WARNING “ もうだめ ... ”); linux/kernel.h[L91]: #define KERN_EMERG &quot;<0>&quot; /* system is unusable */ #define KERN_ALERT &quot;<1>&quot; /* action must be taken immediately */ #define KERN_CRIT &quot;<2>&quot; /* critical conditions */ #define KERN_ERR &quot;<3>&quot; /* error conditions */ #define KERN_WARNING &quot;<4>&quot; /* warning conditions */ #define KERN_NOTICE &quot;<5>&quot; /* normal but significant condition */ #define KERN_INFO &quot;<6>&quot; /* informational */ #define KERN_DEBUG &quot;<7>&quot; /* debug-level messages */
  25. 25. printk() <ul><li>printf() は標準出力に出力するに対して、 printk() はコンソールへ出力することや syslogd にログさせることができる。
  26. 26. KERN_* によって扱いが変わる </li><ul><li>ログするだけなのか、コンソールへ出力するだけなのか </li><ul><li>要するに、 syslog() の ログレベル </li></ul></ul></ul>
  27. 27. /* モジュール作成に必要 */ #include < linux/module.h > /* KERN_INFO に必要 */ #include < linux/kernel.h > /* load したとき */ int init_module(void){ printk(KERN_INFO &quot;Hello World &quot;); return 0; } /* rmmod したとき */ void cleanup_module(void){ printk(KERN_INFO &quot;..dying &quot;); } helloworld.c
  28. 28. $ make <ul><li>テスト環境は vanilla* カーネル </li><ul><li>(*kernel.org のカーネル ) </li></ul><li>その他のディストリビューションは build-essential みたいなのを emerge しないといけないかもしれない。 </li></ul>
  29. 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. 30. $ make /var/log/messages らへんに、 Hello World #insmod した時 ...dying #rmmod した時 と表示されていることでしょう。
  31. 31.
  32. 32. なわけない
  33. 33. /* モジュール作成に必要 */ #include < linux/module.h > /* KERN_INFO に必要 */ #include <linux/kernel.h> /* load したとき */ int init_module(void){ printk(KERN_INFO &quot;Hello World &quot;); return 0; } /* rmmod したとき */ void cleanup_module(void){ printk(KERN_INFO &quot;..dying &quot;); } MODULE_*()
  34. 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. 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. 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 &quot;Hello World &quot;); return 0; } /* rmmod したとき */ void cleanup_module(void){ printk(KERN_INFO &quot;..dying &quot;); } helloworld.c
  37. 37. 最後に <ul><li>簡略化するため、 Kbuild については何も触れませんでした。
  38. 38. module_init() 及び module_exit() についても触れませんでした。
  39. 39. helloworld が syslog() されたら幸せになれます。 </li></ul>Icons: http://www.iconlook.com/
  40. 40. ご清聴ありがとうございました。 筑波大学 Linux User Group Twitter: @tsukuba_linux http://www.tsukuba-linux.org/
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×