Linux驅動開發之模塊化加載方法

目錄:

一、編寫一個最簡單的hello.c的驅動程序。

二、把此程序直接放到內核目錄下的    ......./char目錄中。應該怎樣修改Makefile以及Kconfig來實現動態的模塊化加載

三、在內核目錄下的      ......./char 目錄中新建立一個hello_new/的目錄(因爲在這個字符驅動可能會有較多的源文件以及其他的輔助文件時需要建立一個單獨的目錄讓文件結構更加清楚)



一:編寫一個簡單的hello_module.c文件

代碼如下:

/*
 *  Helloc, World!  我們的第一個模塊
 */
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
/*
 *    Hello_init 初始化函數
 */
static int hello_init(void)
{
	printk(KERN_ALERT "I bear a charmed life.\n");
	return 0;
}
/*
 *    Hello_exit 退出函數
 */
static void hello_exit(void)
{
	printk(KERN_ALERT "Out Out, brief candle!\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Chen");
hello_init()函數是模塊的入口,模塊的所有初始化函數必須符合下面的形式

int my_init(void),因爲init函數一般不會在外部調用,所以標記爲static。

對於退出函數也必須符合void my_exit(void)的形式。如果文件被靜態的編譯到內核中,那麼退出函數將不包含退出函數,而且永遠也不會調用退出函數。

二、把此程序直接放到內核目錄下的    ......./char目錄中。應該怎樣修改Makefile以及Kconfig來實現動態的模塊化加載

1)........./char/Makefile文件中的修改:

增加如下語句:     obj-$(CONFIG_HELLO_MODULE)      += hello_module.o    ($(CONFIG_HELLO_MODULE) 主要是與Kconfig中建立內核源碼樹對應使用)

2)....../char/Kconfig文件中的修改:

增加如下語句:   

config HELLO_MODULE
    tristate "Mini2440 module sample new"
    depends on MACH_MINI2440
    default m if MACH_MINI2440
    help
      Mini2440 module sample new.

這裏的HELLO_MODULE與Makefile文件中的CONFIG_HELLO_MODULE後半部分對應。而不是hello_module.c這個文件名字去對應。

其中tristate表示3態的意思,即這個模塊有Y、M、N三種狀態,在make menuconfig的選項中可以進行選擇。Y是表示靜態的編譯到內核中去。N表示內核不包含此模塊。M表示內核把此模塊以模塊的形式編譯到模塊中去。

depends on MACH_MINI2440,表示次模塊對MACH_MINI2440模塊有依賴關係。只有具備了依賴的模塊纔回出現此模塊。如果依賴模塊是Y,則此模塊可以是Y、M、N,如果依賴模塊是M,則此模塊可以是M、N,

 default m if MACH_MINI2440表示如果具備這個模塊了,默認是模塊化編譯。

help後面的都屬於提示性的化,在make menuconfig的時候,點擊help出現的,並且在make menuconfig的時候這個模塊的名字爲Mini2440 module sample new

3)在做了上面步驟後,進入到.../linux-2.6.32.2這個源代碼文件夾,執行make menuconfig,根據需要進行一些選擇。再執行make zImage。最後把zImage下載到開發板。

4)在.../linux-2.6.32.2這個源代碼文件夾執行make modules,生成hello_module.ko,在把此文件上傳到開發板,並且放到/lib/modules/2.6.32.2-FriendlyARM文件夾中,執行modprobe hello_module就可以看到在終端打印出

I bear a charmed life.
再執行modprobe -r  hello_module或則rmmod hello_module就可以看到
Out Out, brief candle!
insmod以及rmmod都僅僅加載指定的模塊,不會執行任何依賴性或進一步錯誤檢測。而modprobe不但會加載指定的模塊,而且會自動加載任何它所依賴的有關模塊。modprobe是最佳的模塊加載方式。

三、在內核目錄下的      ......./char 目錄中新建立一個hello_new/的目錄(因爲在這個字符驅動可能會有較多的源文件以及其他的輔助文件時需要建立一個單獨的目錄讓文件結構更加清楚)

1)在....../char目錄下建立hello/這個文件夾。把原來的hello_module.c文件移動到這個文件中去,並且刪除其他的hello_module*的文件。

2)在hello/文件夾下建立Makefile以及Kconfig兩個文件。

3)在Makefile文件寫入如下內容:

obj-$(CONFIG_HELLO_MODULE)    += hello_module.o

如果以後不是一個源文件時。則這樣寫

obj-$(CONFIG_HELLO_MODULE)    += hello_module.o

hello_module-objs    :=   hello_module-first.o hello_module-second.o

這樣,hello_module-first.c與hello_module-second.c源文件就會自動被編譯進去。(其實在Makefile的編寫的時候用到了Makefile的潛規則,自動可以生成源文件對應的.o文件)

4)

在Kconfig文件中寫入如下內容:

config HELLO_MODULE
    tristate "Mini2440 module sample new second"
    depends on MACH_MINI2440
    default m if MACH_MINI2440
    help
      Mini2440 module sample new second.

這裏多了一個second主要目的是和第一次編譯的區別,讓自己看到,是這次編譯成功了,而不是上一次。

5)進入到...../char目錄下,修改此目錄中的Makefile以及Kconfig

Makefile文件:

先刪除在第一次編譯過程中添加的東西(當然如果直接使用這種方法進行編譯,則不用刪除了)

在文件中加入如下語句

obj-$(CONFIG_HELLO_MODULE)    += hello/

Kconfig文件:

先刪除在第一次編譯過程中添加的東西(當然如果直接使用這種方法進行編譯,則不用刪除了)

在文件中加入如下語句

source "drivers/char/hello/Kconfig"

6)後面步驟和     二中的     3)   4)步驟一致。

爲了確認自己是否,成功,可以修改hello_module.c的輸出信息,重新進行模塊生成,再放入開發板,進行模塊加載,看打印輸出信息是否改變了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章