LKM カーネルモジュールを作成方法メモ

  • で、モジュール作成方法
    • どうせならroot権限なしの場合でも作る方法のメモ。普通のやり方は以下の通り。まずroot権限でソースをインストールしなければいけない。(そんなの無いのでで後に続く)
// /usr/src/kernels/2.6.18-164.el5-i686 をインストールする。
# rpm -ivh kernel-devel-2.6.18-164.el5.i686.rpm

// http://tldp.org/LDP/lkmpg/2.6/html/x121.html
$ cat > hello-1.c
/*  
 *  hello-1.c - The simplest kernel module.
 */
#include <linux/module.h>	/* Needed by all modules */
#include <linux/kernel.h>	/* Needed for KERN_INFO */

int init_module(void)
{
	printk(KERN_INFO "Hello world 1.\n");

	/* 
	 * A non 0 return means init_module failed; module can't be loaded. 
	 */
	return 0;
}

void cleanup_module(void)
{
	printk(KERN_INFO "Goodbye world 1.\n");
}
<Ctrl+D>

// http://tldp.org/LDP/lkmpg/2.6/html/x181.html
$ cat > Makefile
obj-m += hello-1.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
<Ctrl+D> 

// hello-1.c を make
$ make
make -C /lib/modules/2.6.18-164.el5/build M=/home/mio/tmp/aaa modules
make[1]: Entering directory `/usr/src/kernels/2.6.18-164.el5-i686'
  Building modules, stage 2.
  MODPOST
make[1]: Leaving directory `/usr/src/kernels/2.6.18-164.el5-i686'

 
 

    • ローカルでやる方法。手動でrpmを展開してその中身でモジュールを作る。要はパスさえ合っていれば問題なし!
// 合うものを取ってくる
$ uname -a
Linux mio 2.6.18-164.el5 #1 SMP Thu Sep 3 03:33:56 EDT 2009 i686 i686 i386 GNU/Linux
$ wget http://vault.centos.org/5.4/os/i386/CentOS/kernel-devel-2.6.18-164.el5.i686.rpm

// 展開
$ rpm2cpio kernel-devel-2.6.18-164.el5.i686.rpm | cpio -idv
$ ls
kernel-devel-2.6.18-164.el5.i686.rpm  usr

// /usr/src/kernels/2.6.18-164.el5-i686 と同じものが出来上がる
$ ls usr/src/kernels/2.6.18-164.el5-i686/
Makefile        arch     fs       kabi_whitelist  net       sound
Module.kabi     block    include  kernel          samples   symsets-2.6.18-164.el5.tar.gz
Module.markers  crypto   init     lib             scripts   usr
Module.symvers  drivers  ipc      mm              security

// http://tldp.org/LDP/lkmpg/2.6/html/x121.html
$ cat > hello-1.c
/*  
 *  hello-1.c - The simplest kernel module.
 */
#include <linux/module.h>	/* Needed by all modules */
#include <linux/kernel.h>	/* Needed for KERN_INFO */

int init_module(void)
{
	printk(KERN_INFO "Hello world 1.\n");

	/* 
	 * A non 0 return means init_module failed; module can't be loaded. 
	 */
	return 0;
}

void cleanup_module(void)
{
	printk(KERN_INFO "Goodbye world 1.\n");
}
<Ctrl+D>

// http://tldp.org/LDP/lkmpg/2.6/html/x181.html
$ cat > Makefile
obj-m += hello-1.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
local:
	make -C usr/src/kernels/2.6.18-164.el5-i686 M=$(PWD) modules

clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
<Ctrl+D> 

$ make local
make -C usr/src/kernels/2.6.18-164.el5-i686 M=/home/mio/tmp/bbb modules
make[1]: Entering directory `/tmp/mio/bbb/usr/src/kernels/2.6.18-164.el5-i686'
  Building modules, stage 2.
  MODPOST
make[1]: Leaving directory `/tmp/mio/bbb/usr/src/kernels/2.6.18-164.el5-i686'