Linux內核模組之基本編譯方法

重點擷取Linux Driver基本編寫、編譯的方法,與相關工具使用、Linux Device文件讀取...等資訊,方便後序查詢。

(一)基本Hello.c撰寫:
#include "linux/init.h"
#include "linux/module.h"


static int hello_data __initdata = 1;  //該資料會放在init段

static char *prog_name = "hello driver world";  //insmod時可帶參數module_param(prog_name, charp, S_IRUGO );
//insmod hello.ko prog_name='good job' 
//類型有byte、short、int、long、charp、bool、invbool、u(unsign)

static int prog_num = 1000;  //insmod時可帶參數
module_param(prog_num, int, S_IRUGO);
 

static int __init hello_init(void)
{
        printk(KERN_INFO "Hello World enter\n");

        printk(KERN_INFO "prog name %s\n", prog_name);
        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(函數名或變數名);

沒有留言:

張貼留言