linux 核心程式設計(二) 編寫一個簡單的核心模組
一個簡單的demo
#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> static int lkm_init(void) { printk("insmod\n"); return 0; } static void lkm_exit(void) { printk("rmmod\n"); } module_init(lkm_init); module_exit(lkm_exit);
- #include <linux/module.h>
所有的核心模組都要包含該檔案
- #include <linux/kernel.h>
包含了常用的核心函式
- #include <linux/init.h>
包含了巨集_init和_exit
- module_init()
這是驅動程式初始化的入口點。對於內建模組,核心在引導時呼叫該入口點;對於可載入模組則在該模組插入核心時才呼叫
- module_exit()
模組退出
編譯
Makefile檔案
obj-m += lkm.o CURRENT_PATH := $(shell pwd) LINUX_KERNEL := $(shell uname -r) LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL) all: make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules clean: make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
然後在該目錄下執行make
插入核心
kaka@kaka-virtual-machine:~/kernel$ sudo rmmod lkm.ko kaka@kaka-virtual-machine:~/kernel$ dmesg | tail [204609.874990] lkm: module license 'unspecified' taints kernel. [204609.875009] Disabling lock debugging due to kernel taint [204609.875221] lkm: module verification failed: signature and/or required key missing - tainting kernel [204609.882581] insmod [204761.411917] rmmod [210555.321196] IPv6: ADDRCONF(NETDEV_UP): ens33: link is not ready [210555.330298] IPv6: ADDRCONF(NETDEV_UP): ens33: link is not ready [210555.333058] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None [210555.334157] IPv6: ADDRCONF(NETDEV_CHANGE): ens33: link becomes ready [213125.278958] insmod
dmesg能夠列印核心訊息
此時列印了我們核心模組中的insmod訊息
檢視核心中的模組
kaka@kaka-virtual-machine:~/kernel$ lsmod | grep lkm lkm163840
kaka@kaka-virtual-machine:~/kernel$ cat /proc/kallsyms | grep lkm 0000000000000000 t lkm_init[lkm] 0000000000000000 t lkm_exit[lkm] 0000000000000000 d __this_module[lkm] 0000000000000000 t cleanup_module[lkm] 0000000000000000 t init_module[lkm]
解除安裝模組
kaka@kaka-virtual-machine:~/kernel$ dmesg | tail [204609.875009] Disabling lock debugging due to kernel taint [204609.875221] lkm: module verification failed: signature and/or required key missing - tainting kernel [204609.882581] insmod [204761.411917] rmmod [210555.321196] IPv6: ADDRCONF(NETDEV_UP): ens33: link is not ready [210555.330298] IPv6: ADDRCONF(NETDEV_UP): ens33: link is not ready [210555.333058] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None [210555.334157] IPv6: ADDRCONF(NETDEV_CHANGE): ens33: link becomes ready [213125.278958] insmod [213476.048125] rmmod
檢視此時的模組
kaka@kaka-virtual-machine:~/kernel$ lsmod | grep lkm kaka@kaka-virtual-machine:~/kernel$ cat /proc/kallsyms | grep lkm
均為空