Linux内核模块机制API¶
__module_address¶
头文件¶
#include <linux/module.h>
功能¶
用于根据给定的一个内存地址 addr,获得该内存地址所在的模块。
调用之前要禁止中断(禁止抢占),放置模块再执行
__module_ref_addr¶
头文件¶
#include <linux/module.h>
功能¶
获得模块 mod 的引用计数所在的内存地址单元,从而通过改变地址单元的内容,实现对其引用计数的改变
__module_text_address¶
头文件¶
#include <linux/module.h>
功能¶
该函数获取一个模块指针,但必须满足条件:addr所表示的内存地址落在该模块的代码段中。
返回 struct module 类型的指针
__print_symbol¶
功能同 sprint_symbol
头文件¶
#include <linux/kallsyms.h>
功能¶
该函数根据一个内存中的地址 address 查找一个内核符号,并将该符号的基本信息(例如符号名name)、它在内核符号中的偏移 offset 和大小size、所述的模块名等信息以格式化串 fmt 的形式输出。
__symbol_get¶
头文件¶
#include <linux/module.h>
功能¶
根据给定的内核符号名,获取该符号的内存地址。
__symbol_put¶
头文件¶
#include <linux/module.h>
功能¶
该函数的功能是根据给定的内行人符号名 symbol,找到其所在的内核模块,并将该模块的引用计数减1.
find_module¶
头文件¶
#include <linux/module.h>
功能¶
用来获得一个指向模块的指针。它是根据给定的模块名字查找模块链表,如果找到一个与给定模块名字相匹配的模块则返回该模块的指针。
内核中模块名字是唯一的
find_symbol¶
头文件¶
#include <linux/module.h>
功能¶
module_is_live¶
头文件¶
#include <linux/module.h>
功能¶
判断模块是否处于活动状态
输入参数是模块结构体指针,通过find_module获得
返回 1 表示处于活动状态
返回 0 表示不处于活动状态
module_put¶
头文件¶
#include <linux/module.h>
功能¶
将一个特定模块的引用计数减1,只有引用计数减1之后才能实现模块卸载
module_refcount¶
头文件¶
#include <linux/module.h>
功能¶
该函数用来获取模块的引用计数,返回值表示模块被引用的次数
sprint_symbol¶
头文件¶
#include <linux/kallsyms.h>
功能¶
该函数根据一个内存中的地址 address 查找一个内核符号,并将该符号的基本信息,如符号名、它在内核符号表中的偏移和大小,所属模块名等信息连接成字符串赋值给文本缓存区 buffer。
返回表示 buffer 字符串的长度
symbol_put_addr¶
头文件¶
#include <linux/module.h>
功能¶
根据给定的一个内存地址 addr,找到该地址所在的模块后,将模块的引用计数减1.它与__symbol_put函数有类似的功能,只是二者参数不一致
try_module_get¶
头文件¶
#include <linux/module.h>
功能¶
先判断模块是否处于活动状态,然后通过 local_inc() 操作将模块引用计数加1.
use_module¶
头文件¶
#include <linux/module.h>
功能¶
实现模块 a 使用 模块 b,同时将模块b的引用计数加1.
如果对模块a可以使用模块b,或者模块b之前已经被模块a所使用,则返回1,否则返回0.