在毕业的一年里,买了很多linux的书,每本都有翻过,也翻了不少,但是没有那本能够深入。于是最近决定专心学习《Linux设备驱动程序》,将书中的实验一个一个都做一遍。看跟做的效果完全不一样的,看的书太多也不好,还没学到东西就把思维搅乱了。
下面是第二章中最简单的hello world模块,我在虚拟机下编译x86平台的。
hello_world.c
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello,crule world\n");
return 0;
}
static int hello_exit(void)
{
printk(KERN_ALERT "Goodbye,crule world\n");
return 0;
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
obj-m = hello_world.o
module-objs = hello_world.o
KERNELDIR = /lib/modules/$(shell uname -r)/build
PWD = $(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ *.mod.c *.mod.o *.order *.symvers *.markers *.ko
程序中,printk用于打印一些信息,与printf类似,不同的是printk根据不同日志级别的优先级对消息进行分类,日志级别的宏有KERN_INFO、KERN_ALEAT等,各个宏的含义见第四章。
这里在加载模块之前使用命令“tail -f kern.log”打开日志文件。运行insmod hello_module.ko时,在终端中将显示“Aug 2 06:45:22 ubuntu kernel: [ 4228.668791] Hello,crule world”类似的打印信息。模块卸载时有类似的显示。
交流邮箱:
阅读(449) | 评论(0) | 转发(0) |