模块源码:
#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT " Hello World enter\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT " Hello World exit\n "); } module_init(hello_init); module_exit(hello_exit); MODULE_AUTHOR("Song Baohua"); MODULE_DESCRIPTION("A simple Hello World Module"); MODULE_ALIAS("a simplest module");
obj-m := hello.o
make -C /usr/src/linux-2.6.15.5/ M=/driver_study/ modules
make –C /usr/src/linux-2.6.15.5 M=$(pwd) modules
[root@localhost driver_study]# make -C /usr/src/linux-2.6.15.5/ M=/driver_study/ modules make: Entering directory '/usr/src/linux-2.6.15.5' CC [M] /driver_study/hello.o /driver_study/hello.c:18:35: warning: no newline at end of file Building modules, stage 2. MODPOST CC /driver_study/hello.mod.o LD [M] /driver_study/hello.ko make: Leaving directory '/usr/src/linux-2.6.15.5'
中间生成的hello.mod.c文件的源代码如下所示:
#include <linux/module.h> #include <linux/vermagic.h> #include <linux/compiler.h> MODULE_INFO(vermagic, VERMAGIC_STRING); struct module _ _this_module _ _attribute_ _((section(".gnu.linkonce.this_module"))) = { .name = KBUILD_MODNAME, .init = init_module, #ifdef CONFIG_MODULE_UNLOAD .exit = cleanup_module, #endif }; static const char _ _module_depends[] _ _attribute_used_ _ _ _attribute_ _((section(".modinfo"))) = "depends=";
如果一个模块包括多个.c文件,则应该如下写Makefile:
obj-m := modulename.o module-objs := file1.o file2.o
参考资料:《linux设备驱动开发详解》 宋宝华