1. 程式人生 > >linux 核心模組程式設計之編譯多個原始檔(三)

linux 核心模組程式設計之編譯多個原始檔(三)

編譯擁有多個原始檔的核心模組的方式和編譯一個原始檔的方式差不多,我們先來看下我們需要的檔案都有哪些。

首先是main.c檔案

#include <linux/module.h>
#include <linux/init.h>  

MODULE_LICENSE("GPL");
MODULE_AUTHOR("David Xie");
MODULE_DESCRIPTION("Hello World Module");
MODULE_ALIAS("a simplest module");


extern int add(int a, int b);
static int __init hello_init()
{
    printk("Hello world![%d]\n",add(1,2));
    
    return 0;
}

static void __exit hello_exit()
{
    printk("<7>Hello <0>exit\n");
}

module_init(hello_init);
module_exit(hello_exit);
然後是add.c檔案

int add(int a, int b)
{
	return a+b;
}

然後是makefile檔案

ifneq ($(KERNELRELEASE),)

obj-m := hello.o
hello-objs := main.o add.o
else

KERNELDIR ?= /home/grb/grb/arm/linux-2.6.38/

PWD := $(shell pwd)

all:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
	rm -f *.ko *.o *.mod.o *.mod.c *.symvers *~ *.order

endif

這裡呼叫外部c檔案有點不一樣,我們只要在需要呼叫的檔案中使用extern宣告下,就好了。


其他的一些說明

MODULE_LICENSE("GPL");  // "GPL" 是指明瞭 這是GNU General Public License的任意版本

                        // 

GPL v2” 是指明 這僅宣告為GPL的第二版本

                        // "GPL and addtional"

                        // "Dual BSD/GPL"

                        // "Dual MPL/GPL"

                        // "Proprietary"  私有的

                        // 除非你的模組顯式地宣告一個開源版本,否則核心會預設你這是一個私有的模組(Proprietary)

MODULE_LICENSE 用來告知核心,該模組帶有一個許可證,沒有這樣的說明,載入模組時,核心會抱怨。有效的許可證有“GPL”、“GPL v2”、“GPL and addtional”、“ual BSD/GPL”、“Dual MPL/GPL”和“Proprietary

 

MODULE_AUTHOR           // 宣告作者

MODULE_DESCRIPTION      // 對這個模組作一個簡單的描述,這個描述是"human-readable"

MODULE_VERSION          // 這個模組的版本

MODULE_ALIAS            // 這個模組的別名

MODULE_DEVICE_TABLE     // 告訴使用者空間這個模組支援什麼樣的裝置

MODULE_宣告可以寫在模組的任何地方(但必須在函式外面),但是慣例是寫在模組最後。


編譯檔案



執行測試

然後把編譯出來的hello.ko檔案拷貝到我們的開發板上,執行結果如下