1.子產品參數
/*
*
* 說明:用于示範子產品參數的基本使用方法,加載該子產品
* 時,在指令行中添加val=xxx,則在控制台中将會
* 列印出對應的參數值,否則列印0。
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
static int val = 0;
/*
* 子產品的入口函數沒有參數,要在子產品加載時指定某些特定
* 的參數,需要通過module_param宏來進行相應處理。後面
* 的0表示權限,通常設為0即可。
*/
module_param(val, int, 0);
static int __init fsmod_init(void)
{
printk(KERN_INFO "Hello, Farsight!\n");
printk(KERN_INFO "val = %d\n", val);
return 0;
}
static void __exit fsmod_exit(void)
{
printk(KERN_INFO "Goodbye, Farsight!\n");
}
module_init(fsmod_init);
module_exit(fsmod_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("xxxx <[email protected]>");
MODULE_DESCRIPTION("This is an example for linux driver module");
2.一個子產品由多個C檔案組成的編譯方法
foo.c
#include <linux/kernel.h>
void foo(void)
{
printk(KERN_INFO "I am foo\n");
}
mod.c
/*
*
* 說明:用于示範由多個c檔案構成一個子產品的編譯方法。
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
/*
* foo 函數在其他地方定義
*/
extern void foo(void);
static int __init fsmod_init(void)
{
printk(KERN_INFO "Hello, Farsight!\n");
foo();
return 0;
}
static void __exit fsmod_exit(void)
{
printk(KERN_INFO "Goodbye, Farsight!\n");
}
module_init(fsmod_init);
module_exit(fsmod_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("xxxx <[email protected]>");
MODULE_DESCRIPTION("This is an example for linux driver module");
Makefile
ifeq ($(KERNELRELEASE),)
PWD := $(shell pwd)
KERNELDIR ?= /home/Kevin/Workspace/FSC100/kernel/linux-2.6.35-farsight
INSTALLDIR ?= /home/Kevin/Workspace/FSC100/rootfs
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) INSTALL_MOD_PATH=$(INSTALLDIR) modules_install
clean:
rm -rf *.o *.ko *.mod.c .*.cmd modules.order Module.symvers .tmp_versions
else
# 指定子產品的名稱
obj-m := fsmod.o
# 由多個檔案編譯而成的子產品,用子產品名加-objs字尾,然後給出該子產品的依賴檔案清單,
# 這樣就可以自動編譯多個源檔案,進而編譯出最終的子產品
fsmod-objs := mod.o foo.o
endif
3.子產品符号導出
/*
* 說明:用于示範子產品導出符号的方法。
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
static void foo(void)
{
printk(KERN_INFO "I am foo\n");
}
/*
* 通過EXPORT_SYMBOL來導出符号,這樣其他的子產品就可以
* 引用該符号。如果用EXPORT_SYMBOL_GPL來導出符号,則
* 不滿足GPL協定的子產品不能引用該符号。
*/
EXPORT_SYMBOL(foo);
static int __init fsfoo_init(void)
{
printk(KERN_INFO "fsfoo init\n");
return 0;
}
static void __exit fsfoo_exit(void)
{
printk(KERN_INFO "fsfoo exit\n");
}
module_init(fsfoo_init);
module_exit(fsfoo_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Kevin Jiang <[email protected]>");
MODULE_DESCRIPTION("This is an example for linux driver module");
4.多個子產品同時編譯
//fsfoo.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
static void foo(void)
{
printk(KERN_INFO "I am foo\n");
}
/*
* 通過EXPORT_SYMBOL來導出符号,這樣其他的子產品就可以
* 引用該符号。如果用EXPORT_SYMBOL_GPL來導出符号,則
* 不滿足GPL協定的子產品不能引用該符号。
*/
EXPORT_SYMBOL(foo);
static int __init fsfoo_init(void)
{
printk(KERN_INFO "fsfoo init\n");
return 0;
}
static void __exit fsfoo_exit(void)
{
printk(KERN_INFO "fsfoo exit\n");
}
module_init(fsfoo_init);
module_exit(fsfoo_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Kevin Jiang <[email protected]>");
MODULE_DESCRIPTION("This is an example for linux driver module");
//fsmod.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
extern void foo(void);
static int __init fsmod_init(void)
{
printk(KERN_INFO "fsmod init\n");
foo();
return 0;
}
static void __exit fsmod_exit(void)
{
printk(KERN_INFO "fsmod exit\n");
}
module_init(fsmod_init);
module_exit(fsmod_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Kevin Jiang <[email protected]>");
MODULE_DESCRIPTION("This is an example for linux driver module");
Makefile
ifeq ($(KERNELRELEASE),)
PWD := $(shell pwd)
KERNELDIR ?= /home/Kevin/Workspace/FSC100/kernel/linux-2.6.35-farsight
INSTALLDIR ?= /home/Kevin/Workspace/FSC100/rootfs
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) INSTALL_MOD_PATH=$(INSTALLDIR) modules_install
clean:
rm -rf *.o *.ko *.mod.c .*.cmd modules.order Module.symvers .tmp_versions
else
obj-m := fsmod.o
obj-m += fsfoo.o
endif