【內核】內核模塊之helloworld

前言

很早之前寫過內核模塊,前兩天探究一個問題時又用到了,結果因爲忘記了大部分知識又重新學了一遍,這次還是記錄一下,以後就不用再查了。

正文

準備工作

內核模塊開發與普通應用開發完全不同,再也不是我們熟悉的stdio起手,main開寫。而是單獨的功能函數。

所以我們要先安裝依賴的函數庫(內核代碼)。
以我的Fedora 29(kenel version 4.18.16-300.fc29.x86_64)爲例,自然要安裝對應版本的代碼庫。
sudo dnf install kernel-devel-4.18.16-300.fc29.x86_64
然後在/usr/src/kernel就可以看到對應代碼庫了。

開發流程

主要是一個源碼文件(以test.c爲例)和Makefile文件。
Makefile文件格式相對固定

LINUX_KERNEL_PATH := /usr/src/kernels/$(shell uname -r)
obj-m += test.o
all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

注意目標文件那裏必須是obj-m表示內核模塊,obj-y表示編譯到內核,如果寫其他的話並不能編譯出我們需要的目標文件。

源碼文件

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("kangkang");
MODULE_DESCRIPTION("hook open sys call module");



static int entry_point(void) {

	printk("hello world\n");
	return 0;
}

static void exit_point(void) {
	printk("bye world\n");
}

module_init(entry_point);
module_exit(exit_point);

當然這個寫法也不是唯一的。還可以直接用module_init,而不是傳function pointer

然後就是編譯,安裝內核模塊,卸載內核模塊

$ make
# insmod hello.ko
# rmmod hello

需要注意的是,安裝與卸載都要用root權限,並且一個是文件名,一個只是模塊名(無後綴)
如果卸載不成功的,簡單操作就是直接重啓,複雜的。。請自行google。。。

運行結果

通過dmesg查看

insmod後
在這裏插入圖片描述

rmmod後
在這裏插入圖片描述

最後

來自森醬的友情提示,開發測試內核模塊不要用虛擬機,但最好也不要用自己的開發環境。。。你懂的。
康康在騰訊雲上測試了一下,發現也無法執行insmod大概這類操作被禁止了。

然後在內核模塊開發遇到的函數,因爲沒有man這樣方便的手冊,只能直接查詢源碼了,推薦一個不錯的查看源碼的網站bootlin,可以在各個版本的kernel源碼內查詢指定的函數,非常方便。

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