一个Linux驱动工程师必知的内核模块知识

您所在的位置:网站首页 驱动和内核的关系 一个Linux驱动工程师必知的内核模块知识

一个Linux驱动工程师必知的内核模块知识

2023-04-17 19:20| 来源: 网络整理| 查看: 265

最简单的驱动加载卸载模块命令

模块加载

insmod:加载指定目录下的一个.ko文件到内核。例如:

modprob:自动加载模块到内核,相对于insmod来讲更智能。在执行该命令前最好运行一次depmod命令来更新模块的依赖信息,使用modprobe不指定路径和后缀,例如:

模块卸载

rmmod:卸载模块。例如:

模块信息

modinfo:查看模块的信息。例如:

多个源文件编译生成一个内核模块

例如,将hello.c和world.c两个c文件编译生成一个叫hello_world.o的目标文件,则在Makefile中添加以下两句:

内核污染

insmod ko模块时,可能出现如下提示:

几个可能原因:

模块没有声明GPL协议

当前linux内核版本和编译模块使用的内核版本不一致

使用内核源代码未包含的树外模块

【文章福利】小编推荐自己的Linux内核技术交流群:【749907784】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码) 

printk和printf

在内核中的打印函数是printk,printk和printf的行为非常相似,但是通常printk不支持浮点数,例如要打印一个浮点变量,在编译时通常会出现如下警告,并且模块也不会加载成功:

内核模块参数

在加载一个.ko模块时,也可以像应用程序那样,通过命令行传入一些参数,这个过程发生在调用模块初始化函数之前。

内核支持的参数类型有:bool、invbool(反转值bool类型)、charp(字符串指针)、short、int、long、ushort、uint、ulong。这些类型又可以复合成对应的数组类型。

具体用法,在驱动中定义三个变量baudrate、port、name:

使用module_param和module_param_array宏声明这些变量为模块参数。说明:

name:变量的名字

type:变量或数组元素的类型

nump:数组元素个数的指针,可选

perm:在sysfs文件系统中对应文件的权限属性。

权限的取值参考头文件。

修改这三个变量的值,即加载模块时传参:

C库

内核模块处于C函数库之下,自然就不能调用C库函数(内核源码会实现类似的函数).

而应用程序则可以随意调用C库函数。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3