一、開發環境
內核版本:linux-3.0
開發板:FL2440(nandflash:K9F1G08 128m)
編譯器:arm-linux-gcc 4.3.2
開發板:FL2440(nandflash:K9F1G08 128m)
編譯器:arm-linux-gcc 4.3.2
二、模塊分析:
在裝載內核模塊時,用戶可以向模塊傳遞參數,用module_param(參數名 ,參數類型 , 參數讀/寫權限)爲模塊定義一個參數,傳遞參數形式爲“insmod 模塊名 參數名=參數值”,如果不傳遞,參數將使用模塊內定義的缺省值。參數類型可以是:byte 、short、ushort、int、long,ulong、charp、bool、invbool(布爾的反)。
三、帶參數的內核模塊示例:
/********************book.c***********************/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/module.h>
static char *book_name="dissecting linux device driver";
static int num=400;
static int book_init(void)
{
printk(KERN_INFO " book module installed ");
printk(KERN_INFO " book name :%s\n",book_name);
printk(KERN_INFO " book num :%d\n",num);
static int num=400;
static int book_init(void)
{
printk(KERN_INFO " book module installed ");
printk(KERN_INFO " book name :%s\n",book_name);
printk(KERN_INFO " book num :%d\n",num);
return 0;
}
static void book_exit(void)
{
printk(KERN_INFO " book module exit \n");
return ;
}
module_init(book_init);
module_exit(book_exit);
static void book_exit(void)
{
printk(KERN_INFO " book module exit \n");
return ;
}
module_init(book_init);
module_exit(book_exit);
module_param(num ,int ,S_IRUGO);
module_param(book_name,charp,S_IRUGO);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("liu chengdeng <[email protected]>");
MODULE_DESCRIPTION("a simple module for testing module params");
MODULE_VERSION("v1.0");
module_param(book_name,charp,S_IRUGO);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("liu chengdeng <[email protected]>");
MODULE_DESCRIPTION("a simple module for testing module params");
MODULE_VERSION("v1.0");
四、模塊的編譯:
/**********************Makfile***********************/
ARCH=s3c2440
KERNEL_VER = linux-3.0
LINUX_SRC ?=../linuxrom/$(KERNEL_VER)
PWD := $(shell pwd)
#Kernel module
obj-m +=book.o
#Specify flags for the module compilation
#EXTRA_CFLAGS=-g -O0
mohule:
make -C $(LINUX_SRC) M=$(PWD) modules
make clear
clear:
@rm -rf *.o *.cmd *.mod.c .*ko.cmd .*.o.cmd .*.o.d
@rm -rf *~ core .depend .tmp_versions Module.symvers modules.order -f
clean: clear
@rm -f *.ko
KERNEL_VER = linux-3.0
LINUX_SRC ?=../linuxrom/$(KERNEL_VER)
PWD := $(shell pwd)
#Kernel module
obj-m +=book.o
#Specify flags for the module compilation
#EXTRA_CFLAGS=-g -O0
mohule:
make -C $(LINUX_SRC) M=$(PWD) modules
make clear
clear:
@rm -rf *.o *.cmd *.mod.c .*ko.cmd .*.o.cmd .*.o.d
@rm -rf *~ core .depend .tmp_versions Module.symvers modules.order -f
clean: clear
@rm -f *.ko
五、模塊的加載:
將生成的book.ko文件下載到開發板上:
[root@root /]# ls
apps dev init mnt sys var
bin dev_adc jbs.mp3 proc tmp vim_conf.bin
book.ko etc lib root tslib yw.mp3
data info linuxrc sbin usr
bin dev_adc jbs.mp3 proc tmp vim_conf.bin
book.ko etc lib root tslib yw.mp3
data info linuxrc sbin usr
[root@root /]# insmod book.ko
book module installed
book name :dissecting linux device driver
book num :400
[root@root /]# rmmod book
book module exit
[root@root /]# insmod book.ko book_name='goodbook' num=5000
book module installed
book name :goodbook
book num :5000
book module installed
book name :dissecting linux device driver
book num :400
[root@root /]# rmmod book
book module exit
[root@root /]# insmod book.ko book_name='goodbook' num=5000
book module installed
book name :goodbook
book num :5000
可以看到參數傳遞成功了,整個過程到此就結束了.