寫一個簡單的 Linux Kernel Module

創建資料夾並寫 kernel module

1
2
3
4
5
mkdir helloworld

cd helloworld

vim hello.c
  • hello.c 程式碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* 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 "ByeBye !\n");
}

module_init(hello_init);
//When u use insmod, it will enter hello_init function

module_exit(hello_exit);
//When u use rmmod, it will enter hello_exit function


在同目錄下寫 Makefile

1
vim Makefile
  • Makefile 的內容如下:
1
2
3
4
5
6
7
8
9
10
11
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


使用 sudo make 指令編譯

將他編譯成 .ko

1
sudo make

picture01


使用 insmod 載入 module

1
2
3
4
sudo insmod hello.ko

# 載完後用 dmesg 來觀看 kernel 訊息
dmesg

picture02

可以看到成功 print 出 hello world ! 字串


你也可以使用 lsmod 指令來列出目前在使用的 module

1
2
# grep "hello" 用來濾出我們的 hello module 
lsmod | grep "hello"

picture03


最後想要移除掉模組的話 要使用 rmmod

1
2
3
4
sudo rmmod hello.ko

# 再觀察一次 kernel 訊息
dmesg

picture04

可以看到 print 出了 ByeBye ! 字串