linux驱动----内核模块

目录

一、引言

二、模块的特点

三、模块程序的构成

必要内容

1、模块入口函数

2、模块出口函数

3、模块许可证声明

非必要内容

1、模块参数

2、模块导出符号

3、模块相关信息

四、模块操作命令


一、引言

我们往往需要对内核的大小进行控制,内核的设计遵循的是越小越好原则,当然,Linux有提供这么一种使用模块的机制,在可以实现内核功能的同时,还能控制内核大小。

二、模块的特点

1、可实现动态的扩展内核,并动态的从内核中移除

2、模块本身不被编译进入内核,因此可以控制内核大小

3、模块在加载后,就和内核中的其他部分没什么差别

三、模块程序的构成

必要内容

1、模块入口函数

init_module是模块入口函数

int init_module()
{
    //
    return 0;
}

这种写法是最基本的入口函数写法 

还可以这样,通过module_init,module_init是一个宏,可以指定别的函数作为模块入口,通过这个宏我们就可以自行改换入口函数的名称了。

int __init in(void)//注意这个地方的void必须加上,不然会报错,识别不了
{
    //
    return 0;
}
module_init(in);

此外,模块入口函数一般还加__init进行标识,使用__init能够自动释放内存,也就是说入口函数在使用完后就释放了。

2、模块出口函数

cleanup_module是模块出口函数

void cleanup_module()
{
    //
}

和入口函数一样,出口函数也可以自定义名字

void __exit out(void)
{
    //
}
module_exit(out);

此处的__exit的含义表示,被直接编译进内核的模块的卸载函数会被省略,不编译进内核,因为这个模块被内置了,也就不会被卸载。 

3、模块许可证声明

许可证声明描述内核模块的许可权限,若不声明,模块被加载时,将会有内核被污染的警告。

MODULE_LICENSE("GPL");

此外,模块在被使用时,使用者与被使用者必须保证是同一个许可证声明 

非必要内容

1、模块参数

module_param(参数名,参数类型,参数读/写权限)

使用module_param可以给模块定义一个参数,这个参数必须是全局变量,不能是某个函数内部定义的,使用的方式如下

static int a = 1;
module_param(a, int, 0664);

其中,参数类型可以是byte、short、ushort、int、uint、long、ulong、charp

模块参数传值在模块加载的时候进行,具体如下:

sudo insmod ./test.ko a=1

2、模块导出符号

一个模块可以导出已经准备好的符号(变量或函数),以供其他模块使用。导出的模块中这样写

EXPORT_SYMBOL(符号名);

在要使用的模块中需要先声明外部函数(或变量)

extern 符号的全称
//比如
//extern int mystrlen(char *);

3、模块相关信息

MODULE_AUTHOR(author);//模块的作者信息
MODULE_DESCRIPTION(description);//模块的描述
MODULE_VERSION(version_string);//模块的版本
MODULE_DEVICE_TABLE(table_info);//模块设备表
......

四、模块操作命令

insmod 模块名的路径     //加载模块到内核 执行模块的入口
rmmod   模块名           //从内核卸载模块 执行模块的出口
lsmod                    //查看内核所加载的模块(可以用管道有选择得看)
modinfo 模块名路径        //查看某一个模块的信息
modprobe        //这个命令不仅仅能加载模块,还能将其依赖的模块一并加载
modprobe -r     //这个命令用于卸载模块,可以一并卸载掉他依赖的模块(前提是,他依赖的没有被其他模块正在使用)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

翔在天上飞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值