程序源码
hello.c
#include "linux/init.h"
#include "linux/module.h"
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void){
printk(KERN_INFO "Hello World Start !\n");
return 0;
}
static void hello_exit(void){
printk(KERN_INFO "Hello World Exit ! \n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
KERNELDIR ?=/usr/src/kernels/linux-2.6.38
PWD:=$(shell pwd)
obj-m:= hello.o
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
.PHONY: modules modules_install clean
编译命令
hello_world文件夹如下图
首先在hello_world文件夹进入终端输入make
命令并执行,执行ls命令查看文件目录
执行命令 insmod hello.ko
进行驱动程序加载
执行lsmod
命令也可以查看hello模块是否存在
执行rmmod hello.ko
,卸载hello模块;
执行lsmod
再次查看hello模块已经被卸载
运行效果截图
所有的命令已经执行结束,也没有报错,但是在终端并没有看到Hello World输出?
解决方案一:
由于Linux内核的级别控制,导致printk
打印的内容不一定都能从控制台正常输出,可以使用dmesg
命令来输出所有级别的信息。
解决方案二:
既然printk
打印级别不够,那么将printk
级别设为最高权限即可(日志级别为0-8,0为最高权限);
日志级别一共有8个级别,printk的日志级别定义如下(在include/linux/kernel.h中):
#define KERN_EMERG 0
#define KERN_ALERT 1
#define KERN_CRIT 2
#define KERN_ERR 3
#define KERN_WARNING 4
#define KERN_NOTICE 5
#define KERN_INFO 6
#define KERN_DEBUG 7