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 类型的指针

__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.