Linux核心模組程式設計系列1
阿新 • • 發佈:2018-11-10
1.準備工作
使用如下命令檢視自己Linux的核心版本
uname -a
結果如下:
Linux VM-73-203-debian 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux
安裝核心模組需要的標頭檔案:
apt-get install build-essential linux-headers-`uname -r`
使用如下命令檢視系統模組
cat /proc/modules
結果如下:
xt_nat 16384 0 - Live 0xffffffffc06f3000
veth 16384 0 - Live 0xffffffffc068e000
fuse 98304 0 - Live 0xffffffffc085a000
btrfs 1060864 0 - Live 0xffffffffc072f000
xor 24576 1 btrfs, Live 0xffffffffc0728000
raid6_pq 110592 1 btrfs, Live 0xffffffffc070c000
其中以第一行為例
xt_nat | 16384 | 0 | - | Live | 0xffffffffc06f3000 |
---|---|---|---|---|---|
模組名 | 模組記憶體大小 | 被load的次數 | 是否依賴第三方moudle,-表示不依賴 | 模組狀態 | 模組當前的核心記憶體偏移位置 |
也可以使用如下命令檢視已載入的系統模組
lsmod
結果如下:
Module Size Used by
xt_nat 16384 0
veth 16384 0
fuse 98304 0
btrfs 1060864 0
xor 24576 1 btrfs
raid6_pq 110592 1 btrfs
使用命令modprobe 載入模組,rmmod解除安裝模組
2.極簡模組
程式碼如下,儲存檔案為hello.c,完整程式碼見code:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE(“GPL”);
MODULE_AUTHOR(“Zhang”);
MODULE_DESCRIPTION(“A simple example Linux module.”);
MODULE_VERSION(“0.1”);
static int __init lkm_example_init(void) {
printk(KERN_INFO “Hello, World!\n”);
return 0;
}
static void __exit lkm_example_exit(void) {
printk(KERN_INFO “Goodbye, World!\n”);
}
module_init(lkm_example_init);
module_exit(lkm_example_exit);
我們不能直接用gcc進行編譯,需要使用make進行編譯,完整程式碼見Makefile,Makefile內容如下:
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
注意Makefile中每行的開頭要使用tab而不是空格
下一篇文章Linux核心模組程式設計系列2
參考資料: