linux内核模块机制api(四) __symbol_get()

函数__symbol_get()用于根据给定的内核符号名获取其内存地址,并增加对应模块的引用计数。文章通过示例展示了如何在模块初始化和退出函数中使用此功能,查找并打印内核符号symbol_A和symbol_0的地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数__symbol_get()的功能是根据给定的内核符号名symbol,获得该符号的内存地址,找到其所在的内核模块,并将该模块的引用计数加1。

文件包含:#include <linux/module.h>
函数定义
在内核源码中的位置:kernel/module.c
函数定义格式:void *__symbol_get(const char *symbol)
输入参数说明
symbol:字符串常量,代表内核符号名。
返回参数说明
返回一个void类型指针,其值代表内核符号symbol的地址。如果不存在内核符号symbol,则返回NULL。
实例解析
编写测试文件:__symbol_get.c
头文件及全局变量声明如下:

#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
static int __init __symbol_get_init(void);
static void __exit __symbol_get_exit(void);

模块初始化函数:

int __init __symbol_get_init(void){
    const char * symbol_name ;
    void * addr;

    symbol_name = "symbol_A";    //内核符号名为“symbol_A”
    addr = __symbol_get( symbol_name );

    if( addr ! = NULL )
        printk("the address of %s is: %lx\n", symbol_name, (unsigned long)addr);
    else
        printk("%s isn't found\n", symbol_name);

    symbol_name = "symbol_0";    //内核符号名为“symbol_0”
    addr = __symbol_get( symbol_name );

    if( addr ! = NULL )
        printk("the address of %s is: %lx\n", symbol_name, (unsigned long)addr);
    else
        printk("%s isn't found\n", symbol_name);
    return 0;}

模块退出函数:

void __exit __symbol_get_exit(void){
    printk("module exit ok! \n");
}

模块初始化及退出函数调用:

module_init(__symbol_get_init);
module_exit(__symbol_get_exit);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值