Linux设备驱动 | 如何进行构建和运行模块

作者:世至其美

原文地址:https://hqber.com

内核功能模块

img

设备和模块的分类
  1. 字符设备:可通过字节流(类似文件)进行访问的设备,字符设备驱动程序通常至少要实现open、close、read和write系统调用。
  2. 块设备:进行IO操作,可进行传输若干个完整的块的设备。
  3. 网络接口:任何网络事务都经过一个网络接口形成,网络接口由内核中的网络子系统驱动,负责发送和接收数据包,不需要了解数据包结构和具体的映射。

内核模块和应用程序的区别
  1. 内核模块是运行在内核空间,应用程序是运行在用户空间。
  2. 内核模块的编程方式类似应用程序中事件驱动的编程方式,模块需要预先进行注册,用于服务将来的某个请求。
  3. 应用程序在退出时,可以不管资源的释放或者其他清除工作;而内核模块的退出函数却必须全部撤销初始化函数所做的一切,否则,系统重新引导之前某些东西就会残留在系统中。
  4. 应用程序可以调用未定义的函数,可以通过解析外部引用链接对应的函数库。内核模块仅仅是被链接到内核,只能使用内核中导出的函数,不存在任何可链接库。
  5. 应用程序开发过程中的段错误是无害的,能通过调试器定位到问题源头;内核错误即使不影响系统,也至少会杀死进程。

将模块链接到内核

img

内核具有非常小的栈,可能和一个4096字节大小的页那样小。

在内核API中,函数名称中(__)通常表示接口底层组件,谨慎使用。

内核代码不能实现浮点数运算,如果打开浮点支持,在某些架构上,需要在进入和退出内核空间时保存和恢复浮点处理器的状态。这种额外的开销没有任何价值,内核代码中也不需要浮点运算。

装载和卸载模块

insmod:将模块的代码和数据装入内核,然后使用内核的符号表解析模块中任何未解析的符号,如果内核中没有定义,则报告命令有误,并在系统日志文件中记录“unresolved symbols(未解析的符号)”消息。insmod可以接受一些命令行选项,可以在模块链接到内核之前进行配置参数,变量参数必须经过module_param(变量,类型,sysfs入口项的访问许可掩码)宏(moduleparam.h)来声明。数组参数必须经过module_param_array(数组名称,类型,最大个数,perm访问许可值)来声明。

insmod是依赖于kernel/module.c中的系统调用。

insmod工作原理:

img

modprobe:将模块的代码和数据装入内核,同时会检查装载的模块是否有引用内核中不存在的符号,如果存在这类符号,则在当前模块搜索路径中查找定义这些符号的其他模块,并进行装载该模块所依赖的其他模块到内核中,可以在它的配置文件(/etc/modprob.conf)进行读取参数值.

rmmod:将所有模块从内核中移除,如果内核认为模块还在使用状态或者内核被配置为禁止移除的状态,则无法移除该模块。

lsmod:列出当前装载在内核中的所有模块,并提供其他信息,lsmod是通过读取/proc/modules虚拟文件来获取这些信息。已装载模块的信息也可以在sysf虚拟文件系统的/sys/module下找到。

Linux内核提供一种方法来管理符号对模块外部的可见性,减少命名空间的污染。

导出符号:

  1. EXPORT_SYMBOL(name)
  2. EXPORT_SYMBOL_GPL(name)

注意:符号只能在模块文件的全局导出,不能在函数中导出,导出的变量必须是全局的,存放在模块的可执行文件的一个ELF段。装载时,内核可通过这个段寻找模块导出的代码段。

初始化和关闭

module_init的使用是强制的,这个宏会在模块的目标代码中增加一个特殊的段,标识内核初始化函数所在的位置。

module_exit是帮助内核标识模块清除函数所在的位置。

在初始化过程中,可能会发生错误导致无法继续装载模快,则需要将出错之前的任何注册工作撤销掉,否则系统会残留指向不存在的指针。

作者:世至其美

原文地址:https://hqber.com

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值