全部博文(395)
分类: LINUX
2011-06-14 21:14:33
一。内核模块的练习步骤
[root@bogon 4-1-2]# ls
hello.c Makefile
[root@bogon 4-1-2]# vi hello.c
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("feifei");
MODULE_DESCRIPTION("hello world module");
static int __init hello_init(void){
printk(KERN_ERR "hello world");
return 0;
}
static void __exit hello_exit(void){
printk(KERN_EMERG "hello exit!");
}
module_init(hello_init);
module_exit(hello_exit);
~
~
[root@bogon 4-1-2]# vi Makefile
ifneq ($(KERNELRELEASE),)
obj-m :=hello.o
else
KDIR :=/lib/modules/2.6.29/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
~
二。关于上面Makefile的解释
关于上面这个KDIR :=/lib/modules/2.6.29/build ,这个地方很容易出错,如下
[root@bogon 4-1-2]# ll /lib/modules/2.6.29/
总计 1292
lrwxrwxrwx 1 root root 32 06-13 16:06 build -> /home/guoqian/4-1-1/linux-2.6.29
drwxr-xr-x 9 root root 4096 06-13 16:07 kernel
-rw-r--r-- 1 root root 296703 06-13 16:08 modules.alias
-rw-r--r-- 1 root root 69 06-13 16:08 modules.ccwmap
-rw-r--r-- 1 root root 156855 06-13 16:08 modules.dep
-rw-r--r-- 1 root root 147 06-13 16:08 modules.ieee1394map
-rw-r--r-- 1 root root 218 06-13 16:08 modules.inputmap
-rw-r--r-- 1 root root 2545 06-13 16:08 modules.isapnpmap
-rw-r--r-- 1 root root 74 06-13 16:08 modules.ofmap
-rw-r--r-- 1 root root 37634 06-13 16:06 modules.order
-rw-r--r-- 1 root root 192564 06-13 16:08 modules.pcimap
-rw-r--r-- 1 root root 631 06-13 16:08 modules.seriomap
-rw-r--r-- 1 root root 115066 06-13 16:08 modules.symbols
-rw-r--r-- 1 root root 457214 06-13 16:08 modules.usbmap
lrwxrwxrwx 1 root root 32 06-13 16:06 source -> /home/guoqian/4-1-1/linux-2.6.29
[root@bogon 4-1-2]# ls /lib/modules/2.6.29/build/
arch drivers Kbuild Module.markers scripts vmlinux
block firmware kernel Module.symvers security vmlinux.o
COPYING fs lib net sound
CREDITS include MAINTAINERS README System.map
crypto init Makefile REPORTING-BUGS usr
Documentation ipc mm samples virt
看到了,上面的那个build是一个符号连接,并且连接里面有内容,可是同样的,你可以看看系统自带的:
[root@bogon 4-1-2]# ll /lib/modules/2.6.18-194.32.1.el5/
总计 1356
lrwxrwxrwx 1 root root 49 03-10 23:32 build -> ../../../usr/src/kernels/2.6.18-194.32.1.el5-i686
drwxr-xr-x 2 root root 4096 01-06 07:32 extra
drwxr-xr-x 9 root root 4096 03-10 23:32 kernel
drwxr-xr-x 2 root root 4096 03-15 14:15 misc
-rw-r--r-- 1 root root 290817 03-15 14:16 modules.alias
-rw-r--r-- 1 root root 69 03-15 14:16 modules.ccwmap
-rw-r--r-- 1 root root 238967 03-15 14:16 modules.dep
-rw-r--r-- 1 root root 147 03-15 14:16 modules.ieee1394map
-rw-r--r-- 1 root root 375 03-15 14:16 modules.inputmap
-rw-r--r-- 1 root root 2314 03-15 14:16 modules.isapnpmap
-rw-r--r-- 1 root root 74 03-15 14:16 modules.ofmap
-rw-r--r-- 1 root root 221138 03-15 14:16 modules.pcimap
-rw-r--r-- 1 root root 589 03-15 14:16 modules.seriomap
-rw-r--r-- 1 root root 141915 03-15 14:16 modules.symbols
-rw-r--r-- 1 root root 393321 03-15 14:16 modules.usbmap
lrwxrwxrwx 1 root root 5 03-10 23:32 source -> build
drwxr-xr-x 2 root root 4096 01-06 07:32 updates
drwxr-xr-x 2 root root 4096 01-06 07:32 weak-updates
[root@bogon 4-1-2]# ls /lib/modules/2.6.18-194.32.1.el5/build
/lib/modules/2.6.18-194.32.1.el5/build
对比一下上面的2行红色的内容,你会发现不一样,原因是一个有源码,而第二个没哟源码的。。。。所以说,在编译内核模块的华,一定要有内核源码的哦,呵呵。。。。
三。加载模块
[root@bogon 4-1-2]# ls
hello.c hello.mod.c hello.o Module.markers Module.symvers
hello.ko hello.mod.o Makefile modules.order
[root@bogon 4-1-2]# insmod hello.ko
insmod: error inserting 'hello.ko': -1 Invalid module format
出现了问题,在网上查了一下,是内核模块不匹配的问题,好,我电脑上安装了对应的内核版本,呵呵,reboot一下,然后你看下面这幅图,我选择了自己编译的2.6.29(关于怎么编译自己的内核然后是系统升级,请参照我前一博文)的内核版本,呵呵
在这里我选择第三个,后面再加载和卸载就没有问题了,呵呵
四。关于printk中出现的问题,就是里面的参数(1-7)不同导致的现象不一样,我也没法解释,贴图如下:
主要说的是上面在exit函数中使用的参数第一次是0,就出现了下面卸载rmmod时候出现的问题:如下
而我改为上面的3是就没有问题了,如下:呵呵