Linux內核模塊編程
編程環境
Ubuntu 16.04 LTS
什么是模塊
內核模塊的全稱是動態可加載內核模塊(Loadable Kernel Modul,KLM),可以動態載入內核,讓它成為內核代碼的一部分。
一個模塊一般由一組函數和數據結構組成。
如何編寫最簡單的Hello World模塊
- 首先要創建一個工作目錄,取名叫hello,在命令行輸入如下命令
mkdir hello
cd hello
- hello.c代碼如下:
#include<linux/module.h> //每個模塊都要包括的頭文件
#include<linux/kernel.h> //用到了printk()函數
#include<linux/init.h>
MODULE_LICENSE("GPL"); //沒有指定license會出現error
static int hello_init(void) //static使得該文件以外無法訪問
{
printk(KERN_ALERT "Hello World\n"); //只能使用內核里定義好的C函數,printk會根據日志級別將指定信息輸出到控制台或日志文件中,KERN_ALERT會輸出到控制台
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye World\n");
}
module_init(hello_init);
module_exit(hello_exit);
- Makefile代碼如下:
obj-m := hello.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build #指定內核源碼
PWD := $(shell pwd) #指向當前目錄
all:
make -C $(KERNEL_DIR) M=$(PWD) modules
clean:
make -C $(KERNEL_DIR) M=$(PWD) clean
檢驗模塊工作情況
在命令行輸入:
modinfo hello.ko #modinfo用來查看模塊信息
insmod hello.ko #加載模塊
lsmod #查看已經載入的模塊,看看有沒有hello!
dmesg #如果成功應該可以看到最后一行輸出了hello world
rmmod hello #卸載模塊