程序源碼
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