linux驱动开发——模块基础知识
2014-04-17 16:29
375 查看
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 <xxxx@xxxx.com>");
MODULE_DESCRIPTION("This is an example for linux driver module");
2.[b]一个模块由多个C文件组成的编译方法[/b]
foo.c
#include <linux/kernel.h>
void foo(void)
{
printk(KERN_INFO "I am foo\n");
}mod.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 <coreteker@gmail.com>");
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 <coreteker@gmail.com>");
MODULE_DESCRIPTION("This is an example for linux driver module");
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
/*
*
* 说明:用于演示模块参数的基本使用方法,加载该模块
* 时,在命令行中添加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 <xxxx@xxxx.com>");
MODULE_DESCRIPTION("This is an example for linux driver module");
2.[b]一个模块由多个C文件组成的编译方法[/b]
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 <xxxx@xxxx.com>"); 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 endif3.[b]模块符号导出[/b]
/*
* 说明:用于演示模块导出符号的方法。
*/
#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 <coreteker@gmail.com>");
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 <coreteker@gmail.com>");
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 <coreteker@gmail.com>"); 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
相关文章推荐
- Linux 驱动开发之内核模块开发 (一)—— 内核模块机制基础
- linux驱动基础开发2——linux 驱动开发前奏(模块编程)
- linux驱动基础开发2——linux 驱动开发前奏(模块编程)-转
- Linux 下wifi 驱动开发(一)—— WiFi基础知识解析
- linux驱动基础开发2——linux 驱动开发前奏(模块编程)
- Linux 驱动开发 基础知识及编译过程
- Linux 下wifi 驱动开发(一)—— WiFi基础知识解析
- linux驱动基础开发2——linux 驱动开发前奏(模块编程)
- 编译linux外部驱动模块时的基础知识
- Linux 下wifi 驱动开发(一)—— WiFi基础知识解析
- linux驱动开发的基础知识
- linux模块开发必要的基础知识
- Linux驱动基础开发 Linux 驱动开发前奏(模块编程)
- linux字符设备驱动开发基础知识
- Linux 下wifi 驱动开发(一)—— WiFi基础知识解析
- 编译linux外部驱动模块时的基础知识
- linux驱动基础开发2——linux 驱动开发前奏(模块编程)
- Linux驱动开发①--Linux基础及hello模块
- Linux 下wifi 驱动开发(一)—— WiFi基础知识解析
- Linux 下wifi 驱动开发(一)—— WiFi基础知识解析