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 endif3.模块符号导出
/* * 说明:用于演示模块导出符号的方法。 */ #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
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。