一年前看了RobertLove写的“linux内核设计与实现“,感觉Linux内核并没有那么高不可及,很有想动手 试一试的欲望,现在正好想做一个东西有机会可以体验一把了,主要是最简单的内核模块编程(主要面向应用,底层操作系统实现机制还暂时不去体验),编写设备 驱动时经常用到,下面列出编写一个简单例子的过程:
1.下载内核,编译内核
按照我前两天写的“Debian下编译Linux内核”编译一下,否则会有一大堆未定义和找不到的错误
2.编写hello.c:
/* hello.c */
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int hello_init(void)
{
printk(KERN_ALERT “Entry hello module in Linux kernel.\n”);
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT “Exit hello module!\n”);
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE(“GPL”);
MODULE_AUTHOR(“Simon”);
3.编译hello.c,2.6内核不能像2.4内核一样直接用gcc在任意位置编译了,需要编写Makefile:
obj-m:=hello.o
PWD:=$(shell pwd)
KDIR:=/usr/src/linux
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
然后在hello.c和Makefile的同一目录下执行:
#make
将会生成hello.ko的模块
4.加载module:
#insmod hello.ko
大功告成了,自己的内核模块被加进去了,通过命令lsmod | grep hello就能看了
5.卸载module:
#rmmod hello
6.查看print信息:
内核模块编程不能用printf,只能用printk,把信息打到日志中去了,可以通过查看/var/log/syslog文件看到,或者通过dmesg命令来查看。若要想打到屏幕上,需要改printk的优先级,上面用了KERN_ALERT,用KERN_EMERG的话就能在屏幕上看到了