Linux驅動程序Hello World

程序源碼

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
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章