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'
- 続けて読む
- Hardware with Linux / Linuxでハードウェア
- カーネルモジュールを作る
- とりあえずここを読めば大概のことがわかる