《Linux设备驱动开发》笔记--第4章Linux内核模块


Linux内核模块

不编译进内核映像,控制内核大小可动态加载到Linux内核中执行的程序模块不加载不执行,加载执行便成为内核一部分。

模块文件后缀名为.ko,如hello.ko就是一个模块目标文件。

insmod ./hello.ko or modprobe ./hello.ko 加载模块
rmmod hello or modprobe -r <模块名> 卸载模块

lsmod命令 查看已加载的所有模块和模块间的依赖关系。

lsmod等价于 cat /proc/modules
/proc/modules目录下存放的是模块的信息。

modinfo <模块名> 查看模块作者、模块说明、支持的参数等东西


Linux内核模块的程序组成

1、模块加载函数

insmod或者modprobe加载模块后,模块加载函数就加载到内核中执行初始化模块。
Linux模块加载函数一般以__init标识声明。

static int __init xxx_init_function(void)
{
     			    //初始化代码
}
module_init(xxx_init_function);

Linux内核中,使用request_module(module_name)函数加载内核模块。

2、模块卸载函数

与模块加载函数为相反的过程,卸载模块执行卸载函数。
卸载函数一般以__exit标识声明。

static int __exit  xxx_clean_function(void)
{
                        //释放代码
}
module_exit(xxx_clean_function);

__exit修饰卸载函数,一旦内核将该模块编译进内核,则会忽略卸载函数,不编译进内核镜像。因为编译进内核后就属于内置的模块,不可卸载。

3、模块许可证声明

许可证(LICENSE)声明描述内核模块的许可权,不声明LICENSE,模块被加载时,将收到内核被污染(Kernel Tainted)的警告。Linux内核模块最常见的是以MODULE LICENSE(“GPL v2”)语句声明模块采用GPLv2

4、模块参数(可选)

模块参数是模块被加载的时候可以传递给它的值,它本身对应模块内部的全局变量。
module_param(参数,参数类型,参数读/写权限) 为模块声明一个参数
如:

static char * person_name = "Ares";
module_param(person_name,charp,S_IRUGO);
static int  person_age    =  20;
module_param(person_age,int,S_IRUGO);

参数类型可以是byteshortushortintuintlongulongcharp(字符指针)boolinvbool(布尔的反)

insmode/modprobe 模块名 参数名=参数值 加载内核模块时向模块传递参数
模块被加载后,在/sys/module/目录下将出现以此模块名命名的目录

5、模块导出符号(可选)

内核模块可以导出的符号(symbol,对应于函数变量)。导出之后其他模块则可以使用本模块中的变量或函数。
Linux的/proc/kallsyms文件对应着内核符号表,记录了符号以及符号所在的内存地址
模块用一下宏导出符号到内核符号表

EXPORT_SYMBOL(符号名);
EXPORT_SYMBOL_GPL(符号名);
#include<linux/init.h>
#include<1inux/module.h>
int add(int a, int b)
{
	return a + b;
}
EXPORT_SYMBOL_GPL(add);

int sub(int a, int b)
{
 	return a - b;
}
EXPORT_SYMBOL_GPL(sub);

MODULE_LICENSE("GPL v2");

6、模块作者等信息声明(可选)

MODULE_AUTHOR(author); 声明模块作者
MODULE_DESCRIPTION(description); 模块的描述即模块是干嘛的吧

MODULE_VERSION(version_string); 模块的版本

MODULE_DEVICE_TABLE(table_info); 模块的设备表。对于USB、PCI等设备驱动,通常会创建一个MODULEDEVICE_TABLE,以表明该驱动模块所支持的设备

MODULE_ALIAS(alternate_name); 给模块取别名

7、导出符号

Linux的 /proc/kallsyms 文件对应内核符号表,记录符号及其内存地址。作用:比如导出一个函数到符号表中,那外部程序就可以调用这个函数。

导出符号到内核符号表:
  • EXPORT_SYMBOL(符号名)
  • EXPORT_SYMBOL(符号名) //只适合包含GPL许可权的模块
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲盖弥彰1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值