如何寫一個 Linux Kernel Module

這是撰寫 Kernel module 的小小筆記


開發環境如下:

Ubuntu 14.04 LTS
Kernel 3.19.0-31-generic

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

jerry@router:/etc$ 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,看到以下的訊息就算是完成編譯了

請支持《傑瑞窩在這》原創文章。原文標題:如何寫一個 Linux Kernel Module,原文網址:https://jerrynest.io/how-to-write-a-linux-kernel-module/
$ 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 可以看到編好的檔案們

$ 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 !

參考資料

樂於分享、盡情玩耍的全端工程師。長期關注資訊安全、雲端運算與網路行銷等議題,曾獲得玉山黑客松金牌,擔任過軟體測試實習生、技術文案寫手。

發表迴響