(一)基本Hello.c撰寫:
#include "linux/init.h"
#include "linux/module.h"
{
printk(KERN_INFO "Hello World enter\n");
return 0;
}
module_init(hello_init);
static void __exit hello_exit(void)
{
printk(KERN_INFO "Hello World exit\n");
}
module_exit(hello_exit);
MODULE_AUTHOR("c8631506");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("a simple hello world module");
MODULE_ALIAS("a simplest module");
(二)基本Makefile撰寫:
KVERS = $(shell uname -r)
obj-m += hello.o
#EXTRA_CFLAGS=-g -O0 包含除錯資訊的編譯參數
build: kernel_modules
kernel_modules:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
clean:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
(三)基本操作:
insmod(modprobe) hello.ko:掛載模組。
rmmod(modprobe -r) hello:卸載模組。
modinfo hello.ko:顯示模組資訊。
file hello.ko:顯示檔案資訊。
objdump -x hello.ko: 顯示位元檔資訊。
lsmod:顯示己掛載模組。
tree -a /sys/module/hello:顯示模組檔案樹狀資訊。
request_module(hello.ko):內核呼叫模組函式。
(四)模組結構:
1.模組加載函數:__init。
2.模組卸載函數:__exit。
3.模組許可證明:GPL、GPL v2、GPL and additional rights、Dual BSD/GPL、Dual MPL/GPL、Proprietary。
4.模組參數(可選):
5.模組導出函數或變數(導出符號)(可選):
6.模組作者信息(可選):
(五) 導出符號:
grep 查找字串 /proc/kallsyms:查找內核中的符號。
EXPORT_SYMBOL(函數名或變數名);
EXPORT_SYMBOL_GPL(函數名或變數名);
沒有留言:
張貼留言