前言
复习一下内核模块的几个基础部分内容。
内核模块
初始化和退出函数
分别使用module_init和module_exit设置模块的初始化和退出函数。
1 | // mytest.c |
Makefile 编写
模块都有对应的Makefile来编译。
1 | KERNEL_DIR := /lib/modules/'uname -r'/build |
模块参数
可以给模块传递参数,参数类型可以是byte, short, ushort, int, uint, long, ulong, char 和bool类型。
参数可能会在/sys/module/mytest/xxx,通过参数定义的perm可以控制该sys文件的访问权限,一般使用8进制定义,如S_IRUGO(0444),如果有写权限,那么root用户可以改写sys内容控制参数对应的全局变量。
1 | static int debug=1; |
符号
不同的模块如果有依赖, 被依赖的模块可以导出API接口。
1 | // 一般使用 EXPORT_SYMBOL_GPL(api_function) |
内核导出的符号可以在/proc/kallsyms 中查看。
模块加载和卸载
使用inmod Module.ko 加载模块,会调用模块初始化函数, 如果返回为0则加载成功,否则加载失败。通过lsmod 可以查看所有加载的模块。
使用rmmod Module卸载模块,会调用模块退出函数。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
博客地址: https://fishmwei.github.io
掘金主页: https://juejin.cn/user/2084329776486919