linux驱动学习之module

1、模块

#include <linux/module.h> //module_init

#include <linux/kernel.h> //一些宏定义,printk函数

#include <linux/module.h>//MODULE_LICENSE

static int test_init(void) //无参,有返回值

{

    return 0;

}

static void test_exit(void)//无参数,无返回值

{

}

module_init(test_init); 

module_exit(exit_init);

MODULE_LICENSE("GPL");

2、模块编译方式

静态编译:程序编译链接为zImage的一部分的时候,test_init函数将由module_init创建一个全局的函数指针变量,并且变量被链接到一个自定义段中,在内核启动过程中运行do_initcalls阶段被执行,test_exit函数无效。

动态加载:程序被编译成一个独立模块的时候,test_init被module_init指定为模块入口。在内核运行过程中,使用insmod插入运行时自动执行本函数。exit_init被module_exit指定为模块出口,在内核运行过程中,使用rmmod卸载本模块时,自动执行本函数,主要做一些资源释放操作。

动态加载操作命令:

        插入模块 insmod  test.ko
        卸载模块 rmmod test
        查看当前插入的模块 lsmod
        查看内核的全部打印信息 dmesg

3、模块的深入解析

以内核模块形式存在的驱动,如test.ko,在文件形式上属于ELF文件,可以用file test.ko命令查看,关于ELF文件格式的技术细节,有兴趣的可以研究一下,我们来看下结合linux源码定义的ELF数据结构:


只要了解模块各个部分会根据属性分配到不同的内存区域,设备驱动并不会用到这些数据成员,他们是给内核模块加载器在加载模块的时候使用的。

宏EXPORT_SYMBOL:模块可以调用内核源码或者其他模块实现的函数,主要是通过EXPORT_SYMBOL宏导出符号,这些符号就是放在ELF文件中特殊的section中。

insmod error :Invalid module format:可能原因是运行不用的内核版本的系统加载.ko文件,因为不同版本中可能模块调用的函数不同或者已经消失,为了防止这一问题,内核加入了版本控制机制。



猜你喜欢

转载自blog.csdn.net/weixin_42164528/article/details/80448198