linux驱动开发——模块基础知识


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.一个模块由多个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 <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

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 <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






注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号