如何寫一個 Linux Kernel Module

這是撰寫 Kernel module 的小小筆記,開發環境如下:

  • Ubuntu 14.04 LTS
  • Kernel 3.19.0-31-generic

可以使用 uname -a 指令來察看自己的 Linux 與 Kernel版本

uname -a
Linux router 3.19.0-31-generic #36~14.04.1-Ubuntu SMP Thu Oct 8 10:21:08 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

建立 hello.c

建立並進入一個測試目錄 kernel_test,然後開始編輯 hello.c 檔案

mkdir kernel_test
cd kernel_test
vim hello.c

這裏面有兩個 Function,hello_init 和 hello_exit

// kernel_test/hello.c

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

MODULE_DESCRIPTION("Hello_world");
MODULE_LICENSE("GPL");

static int hello_init(void)
{
 printk(KERN_INFO "Hello world !\n");
 return 0;
}

static void hello_exit(void)
{
 printk(KERN_INFO "Bye !\n");
}

module_init(hello_init);
module_exit(hello_exit);

Makefile

// kernel_test/Makefile

PWD := $(shell pwd) 
KVERSION := $(shell uname -r)
KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/

MODULE_NAME = hello
obj-m := $(MODULE_NAME).o

all:
 make -C $(KERNEL_DIR) M=$(PWD) modules
clean:
 make -C $(KERNEL_DIR) M=$(PWD) clean

編譯 module

在 kernel_test 目錄下執行 make,看到以下的訊息就算是完成編譯了

make
make -C /usr/src/linux-headers-3.19.0-31-generic/ M=/home/jerry/kernel_test modules  make[1]: Entering directory /usr/src/linux-headers-3.19.0-31-generic    Building modules, stage 2.    MODPOST 1 modules   make[1]: Leaving directory/usr/src/linux-headers-3.19.0-31-generic

用 ls 可以看到編好的檔案們

hello.c hello.ko hello.mod.c hello.mod.o hello.o Makefile modules.order Module.symvers

載入/移除 module

使用 insmod 指令來載入 hello.ko

sudo insmod hello.ko

接著用 lsmod 指令來確認 module 是否成功載入 因為系統載入的 module 很多,這邊用 grep 來過濾出我們的 hello module,如下所示

sudo lsmod | grep "hello"
hello 16384 0

最後,把 hello module 移除 使用 rmmod 指令,就可以把 module 移除囉

sudo rmmod hello.ko

執行完載入與移除的動作,我們回過頭來看看 hello.c 裡頭的 hello_init 和 hello_exit 這裡各呼叫了 printk 這個 function,它會在系統日誌上輸出 KERN_INFO 級別的訊息 可以呼叫 dmesg 指令來察看系統日誌

dmesg
...(略)
 [11261.743645] Hello world !
 [12433.528440] Bye !

參考資料

Jerry
Jerry

樂於分享的軟體工程師,曾在新創與大型科技公司實習,獲得黑客松競賽冠軍,擔任資安研討會講者。長期熱衷於資訊安全、雲端服務、網路行銷等領域,希望將科技知識分享給更多人。內容轉載請來信:jlee58tw@gmail.com

2 則留言

發表回應