1、首先写一个简单的内核模块。并命名为hello.c
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("RAIN");
MODULE_DESCRIPTION("Hello world module");
static int __init hello_init(void)
{
printk( "<0>hello world!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_EMERG "hello exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
|
简要说明一下:
有两个很关键的函数:
module_init(hello_init);
module_exit(hello_exit); 他们必须要有的。
2、编写Makefile
ifneq ($(KERNELRELEASE),)
obj-m :=hello.o
else
KDIR:= /lib/modules/2.6.18-194.el5/build
default:
make -C $(KDIR) M=$(PWD) modules
install:
insmod hello.ko
uninstall:
rmmod hello
clean:
rm -f *.ko *.o *.mod.o *.mod.c .symvers
endif
|
简要说明:
obj-m :=hello.o 是说明要根据hello.c生成 hello.o内核模块,一般你的c文件是什么名字这就照着来
KDIR:= /lib/modules/2.6.18-194.el5/build 这里是内核的目录。你可以输入 uname -r 查看一下你的内核是什么,要对应起来的,要不然你无法在你的Linux上加载和卸载你要编译的模块。
make -C $(KDIR) M=$(PWD) modules 这句是在当前目录编译,不用管它。
insmod hello.ko 这句是可选的,意思是你输入 make install 的时候,会加载你的hello.ko内核模块,当然,你也可以在make后,手动做这件事。
rmmod hello 这句参考上条解释。
3、实际运行。
在工程目录下输入
#make
#make install
(或者#insmod hello.ko)
# lsmod | grep hello
上面命令可以查看有没有加载内核hello模块
#make uninstall
(或者#rmmod hello)
|
4、注意问题:
注意源代码里的这句话:
printk(KERN_EMERG "hello exit!\n")
|
你可以输入命令查看你的linux系统下printk的打印等级
[root@localhost 4-1-4]# cat /proc/sys/kernel/printk
6 4 1 7
|
我的电脑是RHEL5,显示的是 6 4 1 7。 简单来说就是printk的每条信息都是带有优先级的,数字越大,优先级越低。现在是数字小于6的都可以在x-term下打印。例如:
printk("<5>hello world ! \n");
printk("<0>hello world ! \n");
|
- 这两个信息都可以在我的终端打印出来,也就是5 和 0 都小于6 。注意<5>一定要在双引号“ ”里面。
- 还有就是,在我的emacs下面运行终端,printk无法信息,优先级为<0>也不管用,不知道为什么,但是切换到linux自带的终端就行了。有知道的朋友麻烦告诉我一下。
- 解决的办法是你可以查看log信息
cat /var/log/messages | grep 关键词(比如你加载的内核模块的名字)
|
应该就可以看到printk的信息了。
阅读(2289) | 评论(1) | 转发(0) |