Linux内核模块简介
这篇文章主要介绍了Linux内核模块的相关概念，以及简单的模块开发过程。主要从模块开发中的常用指令、内核模块程序的结构、模块使用计数以及模块的编译等角度对内核模块进行介绍。在Linux系统开发过程中，以模块的形式开发其重要性不言自明，而在嵌入式设备驱动开发中将驱动程序以模块的形式发布，更是极大地提高了设备使用的灵活性——用户只需要拿到相关驱动模块，再插入到用户的内核中，即可灵活地使用你的设备。概述Linux内核整体结构已经很庞大，包含了很多的组件，而对于我们工程师而言，有两种方法将需要的功能包含进内核当中。         一：将所有的功能都编译进Linux内核。         二：将需要的功能编译成模块，在需要的时候动态地添加。上述两种方式优缺点分析：         第一种：                   优点：不会有版本不兼容的问题，不需要进行严格的版本检查                   缺点：生成的内核会很大；要在现有的内核中添加新的功能，则要编译整个内核         第二种：优点：模块本身不编译进内核，从而控制了内核的大小；模块一旦被加载，将和其它的部分完全一样。缺点：可能会有内核与模块版本不兼容的问题，导致内核崩溃；会造成内存的利用率比较低。模块开发常用的指令在内核模块开发的过程中常用的有以下指令。1）  insmod: 将模块插入内核中，使用方法：#insmod XXX.ko2）  rmmod: 将模块从内核中删除，使用方法：#rmmod XXX.ko3）  lsmod: 列表显示所有的内核模块，可以和grep指令结合使用。使用方法：#lsmod | grep XXX4）  modprobe: modprobe可载入指定的个别模块，或是载入一组相依赖的模块。modprobe会根据depmod所产生的依赖关系，决定要载入哪些模块。若在载入过程中发生错误，在modprobe会卸载整组的模块。依赖关系是通过读取 /lib/modules/2.6.xx/modules.dep得到的。而该文件是通过depmod 所建立。5）  modinfo: 查看模块信息。使用方法：#modinfo XXX.ko6）  tree –a: 查看当前目录的整个树结构。使用方法：#tree -a内核模块程序结构1）  模块加载函数（一般需要）在用insmod或modprobe命令加载模块时，该函数被执行。完成模块的初始化工作。Linux内核的模块加载函数一般用__init标识声明，模块加载函数必须以module_init(函数名)的形式被指定。该函数返回整型值，如果执行成功，则返回0，初始化失败时则返回错误编码，Linux内核当中的错误编码是负值，在&lt;linux/errno.h&gt;中定义。在Linux中，标识__init的函数在连接时放在.init.text这个区段，而且在.initcall.init中保留一份函数指针，初始化的时候内核会根据这些指针调用初始化函数，初始化结束后释放这些init区段（包括前两者）。代码清单：2）  模块卸载函数（一般需要）在用rmmod或modprobe命令卸载模块时，该函数被执行。完成与加载相反的工作。模块的卸载函数和模块加载函数实现相反的功能，主要包括代码清单：3）  模块许可证声明（必须）如果不声明，则在模块加载时会收到内核被污染的警告，一般应遵循GPL协议。代码清单：1 MODULE_LICENSE(&#34;GPL&#34;);4）  模块参数（可选）模块在被加载时传递给模块的值，本身应该是模块内部的全局变量。示例程序book.c在向内核插入模块的时候可以用以下方式，并且可以在内核日志中看到模块加载以后变量已经有了值。5）  模块导出符号（可选）使用模块导出符号，方便其它模块依赖于该模块，并使用模块中的变量和函数等。在Linux2.6的内核中，/proc/kallsyms文件对应着符号表，它记录了符号和符号对应的内存地址。对于模块而言，使用下面的宏可以导出符号。1 EXPORT_SYMBOL(符号名);或1 EXPORT_GPL_SYMBOL(符号名);6）  模块信息（可选）模块信息则是指模块的作者信息等。模块的编译将下面的Makefile文件放在book.c同级的目录下，然后使用#make命令或者#make all命令编译即可生成book.ko模块文件。对应的Makefile：使用模块绕开如果功能不编译成模块，则无法绕开GPL，编译成模块后公司发布产品则只需要发布模块，而不需要发布源码。为了Linux系统能够支持模块，需要做以下的工作：总结本文主要介绍内核模块的概念和基本编程方法，内核模块主要由加载、卸载函数功能函数等一系列声明组成。它可以被传入参数，也可以导出符号，供其它的模块使用。原文作者：BreakChen原文地址：Linux内核模块简介 - BreakChen - 博客园（版权归原文作者所有，侵权留言联系删除）内核资料直通车：Linux内核源码技术学习路线+视频教程代码资料免费加入学习：Linux/c/c++/内核源码/音视频/DPDK/Golang云原生/QT