2017年5月4日 星期四

寫一個簡單的 Linux Kernel Module


先創建一個資料夾 並寫個簡單的 kernel module (hello.c)
$ mkdir helloworld
$ cd helloworld
helloworld$ vim hello.c
/* 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
helloworld $ vim 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




最後就可以使用 sudo make 指令來編譯
將他編成 .ko 檔
helloworld$ sudo make















使用 insmod 來載入 module
helloworld$ sudo insmod hello.ko

//載完後用 dmesg 來觀看 kernel 訊息
helloworld$ dmesg











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




你也可以使用 lsmod 指令來列出目前在使用的 module
helloworld$ lsmod | grep "hello"
//grep "hello" 是用來濾出我們的 hello module 的









最後想要移除掉模組的話 要使用 rmmod
helloworld$ sudo rmmod hello.ko

//再觀察一次 kernel 訊息
helloworld$ dmesg











可以看到 print 出了 ByeBye ! 字串

沒有留言:

張貼留言