我的第一个内核模块——Hello,kernel
这个学期,开始接触linux内核,觉得其linux内核的实现机制确实挺有趣的,我个人比较喜欢模块这种设计方式,感觉其极大的扩展了内核,感觉就像是window程序中的动态链接库一样,只有当需要的时候,才会加载进来。
就和人与人之间第一次接触一样,和内核开始打交道,首先还是相互问好(当然,内核跟我们问好,就回馈在它能乖乖的听我的话,把信息正确地输出)。程序很简单,就是在进入内核的时候,打印一个Hello Kernel,离开的时候,再说声See you, Kernel。这个程序基本上是按照陈莉君老师的内核之旅网站上的教程依样画葫芦,非常感谢陈老师的引导以及作者写的这么好的教程。
1 #include<linux/module.h>
2 #include<linux/kernel.h>
3 #include<linux/init.h>
4
5 static int __init hello_init(void)
6 {
7 printk("<1>Hello Kernel!\n"); /*立即输出信息*/
8 return 0;
9 }
10
11 static void __exit hello_cleanup(void)
12 {
13 printk("<1>See you,Kernel!\n");
14 }
15
16 module_init(hello_init); /*进入内核的时候,调用hello_init */
17 module_exit(hello_cleanup); /*离开内核的时候,调用hello_cleanup */
18 MODULE_LICENSE("GPL"); /*协议*/
19
2 #include<linux/kernel.h>
3 #include<linux/init.h>
4
5 static int __init hello_init(void)
6 {
7 printk("<1>Hello Kernel!\n"); /*立即输出信息*/
8 return 0;
9 }
10
11 static void __exit hello_cleanup(void)
12 {
13 printk("<1>See you,Kernel!\n");
14 }
15
16 module_init(hello_init); /*进入内核的时候,调用hello_init */
17 module_exit(hello_cleanup); /*离开内核的时候,调用hello_cleanup */
18 MODULE_LICENSE("GPL"); /*协议*/
19
再接着看看Makefile文件的编写,这个是至关重要的,我第一次没写对,所以编译的时候出问题拉,我一开始还以为是我自己有上面必须的组建没装,后来在同学的指导下并参考内核之旅网站上的内容,才弄好拉这个Makefile,还请您多多指点。
1 obj-m += hello.o #由此目标文件生成模块
2 CURRENT_PATH := $(shell pwd) #当前所在的路径
3 LINUX_KERNEL := $(shell uname -r) #内核的版本号
4
5 #内核代码所在的路径
6 LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
7
8 #编译
9 all:
10 make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
11
12 #清除编译生成的文件
13 clean:
14 make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
2 CURRENT_PATH := $(shell pwd) #当前所在的路径
3 LINUX_KERNEL := $(shell uname -r) #内核的版本号
4
5 #内核代码所在的路径
6 LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
7
8 #编译
9 all:
10 make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
11
12 #清除编译生成的文件
13 clean:
14 make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
然后,编译文件:
make
再接着,插入模块到内核(insert module):
sudo insmod hello.ko
然后看看内核编译输出的信息:
dmesg
我的机子上显示的是:
[ 6848.544940] Hello Kernel!
然后卸载模块(remove module):
sudo rmmod hello.ko
再一次查看内核输出信息:
dmesg
我的机子输出是:
[ 7076.558033] See you,Kernel!
这样,我的第一次模块编程就完成了。希望您能多多提出宝贵的意见,比如说怎么样学习内核编程比较好,先谢谢拉。