カーネルモジュールプログラミング超入門 #1(仮)
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 5,769 views

筑波大学 Linux User Group (つくらぐ)

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

Statistics

Views

Total Views
5,769
Views on SlideShare
5,761
Embed Views
8

Actions

Likes
6
Downloads
29
Comments
0

1 Embed 8

http://www.slideshare.net 8

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • (The Linux) Kernel Module Programming ...for Dummies #1 Takayuki Horimoto opentaka[at]tsukuba-linux.org http://www.tsukuba-linux.org/
    • $whoami
      • Takayuki Horimoto
      • 堀本 貴幸 (opentaka)
      • Gentoo Linux geek
        • GMN-ja ( もう死んだ ...)
        • CJK team 目指して bug を潰します
      • Open Source Software != Free Software
    • Agenda
      • What is a kernel module?
      • lsmod , insmod and modprobe
      • “ hello world ” with printk()
      • Creating a Makefile
      • Introduction to MODULE_*()
      • Summary
    • What is a kernel module?
      • カーネルに load/unload できるバイナリ
      • “ プラグイン ”のようなもの
      • 機能やドライバを追加できるようになる。
      • カーネルを config する時に <M> としたもの。
      • eg. ipv6, ipfilter, usblp (USB printer), usb-storage
    • lsmod , insmod and modprobe
      • $ cat /proc/modules
        • loadされているモジュールの一覧。
        • $ 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
        • モジュールをロードできる。
    • 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.. をロードする
    • # 1 Hello World
    • #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
    • printk() printk(KERN_INFO “ お腹空いた ” ); printk(KERN_ WARNING “ もうだめ ... ” );
    • printk()
        printf() とほぼ同じ。
      printf() : “ printf() は画面に文字を表示させます。” “ ただしワープロソフトで書かないでください ” – やさしいなんとかの本
    • printk()
        printk( KERN_INFO “ お腹空いた ”);
      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 */
    • printk()
      • printf() は標準出力に出力するに対して、 printk() はコンソールへ出力することや syslogd にログさせることができる。
      • KERN_* によって扱いが変わる
        • ログするだけなのか、コンソールへ出力するだけなのか
          • 要するに、 syslog() の ログレベル
    • /* モジュール作成に必要 */ #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
    • $ make
      • テスト環境は vanilla* カーネル
        • (*kernel.org のカーネル )
      • その他のディストリビューションは build-essential みたいなのを emerge しないといけないかもしれない。
    • $ 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
    • $ make /var/log/messages らへんに、 Hello World #insmod した時 ...dying #rmmod した時 と表示されていることでしょう。
    • なわけない
    • /* モジュール作成に必要 */ #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_*()
    • 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) … …
    • 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 ...
    • /* モジュール作成に必要 */ #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
    • 最後に
      • 簡略化するため、 Kbuild については何も触れませんでした。
      • module_init() 及び module_exit() についても触れませんでした。
      • helloworld が syslog() されたら幸せになれます。
      Icons: http://www.iconlook.com/
    • ご清聴ありがとうございました。 筑波大学 Linux User Group Twitter: @tsukuba_linux http://www.tsukuba-linux.org/