亲爱的粉丝朋友们大家好,为了更好的服务大家,提升分析问题和解决问题的能力,先针对Linux内核里面的API函数进行详细分析,并利用案例进行说明,加强对内核API函数的认识。
第一:函数原型
//函数原型struct module *__module_address(unsigned long addr)
//函数作用
函数__module_address()主要用于根据一个内存地址addr
获得该内存地址所有的模块。
//参数说明
unsigned long addr 表示:内存地址addr
//返回值说明
如果内存地址addr在某一模块的地址空间中,则返回该模块名称,否则返回NULL
第二:函数实现案例
//头文件
#include <linux/module.h>
#include <linux/init.h>
//模块加载函数--自定义模块
int a_module(void)
{
return 0;
}
//函数的入口
static int __init __module_address_init(void)
{
//用于接收测试函数返回值
struct module *ret;
//获取到内核a_module地址
unsigned long addr = (unsigned long)a_module;
//调用__module_address()函数之前,必须禁止中断,以防止模块再执行
preempt_disable(); //禁止抢占
ret = __module_address(addr);
preempt_enable(); //允许抢占
//如果不为空,则输出该模块的信息
if(ret != NULL)
{
//输出模块名
printk("ret->name:%s\n",ret->name);
//输出模块状态
printk("ret->state:%d\n",ret->state);
//输出模块引用计数次数
printk("refs of %s is %d \n",ret->name,module_refcount(ret));
}
else
{
printk("__module_address return NULL!\n");
}
return 0;
}
//模块退出函数
static void __exit __module_address_exit(void)
{
printk("module exit ok\n");
}
MODULE_LICENSE("GPL"); //开源协议
//模块加载与退出函数实现
module_init(__module_address_init);
module_exit(__module_address_exit);
第三:案例现象分析
总结:__module_address()函数可以帮助我们分析出来,对应函数在哪里被调用以及调用次数。遇到任何问题,欢迎关注公众号,联系博主^_^。