linux内核模块机制api(七) find_symbol()

find_symbol()函数用于查找内核中的符号,根据提供的名称、模块所有权、CRC校验值和许可类型。成功时返回kernel_symbol结构体指针,包含符号的地址和名称。模块初始化函数示例展示了如何使用该函数并处理查找结果。

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

函数find_symbol()通过给定的内核符号的名字name,以及bool型参数gplok、warn来查找内核符号,并返回描述该符号的结构体指针。如果内核符号存在于动态插入的模块且参数owner不为空,则指针owner指向该模块。
文件包含:#include <linux/module.h>
函数定义
在内核源码中的位置:linux-3.19.3/kernel/module.c
函数定义格式:

const struct kernel_symbol *f ind_symbol(const char *name,
                        struct module **owner,
                        const unsigned long **crc,
                        bool gplok,
                        bool warn)

输入参数说明
name:字符串常量,表示待查找的内核符号的名字,是一个输入型参数。
owner:二级指针,指向所查找的内核符号所属的内核模块的指针,是一个输出型参数,它可以为空。关于结构体module的定义请参见前面关于内核函数find_module()的分析。
crc:二级指针,*crc表示内核符号的crc值所在的地址,它是一个输出型参数。
gplok:bool型变量,如果为真,表示内核符号所属的模块支持GPL许可,如果为假,则不支持。它是一个输入型参数。
warn:bool型变量,表示是否输出警告信息。它是一个输入型参数。
返回参数说明
如果函数find_symbol()查找内核符号成功,则返回值是kernel_symbol结构体类型的指针,它是对所查找到的内核符号的描述,如果查找失败,则返回NULL。
其中内核符号结构体kernel_symbol在内核文件linux-3.19.3/include/linux/export.h中定义:

struct kernel_symbol{
    /*value:如果EXPORT_SYMBOL(fun),则value为符号fun在内核映像中的地址*/
    unsigned long value;

    /*name:指向符号名fun的指针*/
    const char *name;};

实例解析
编写测试文件:find_symbol.c
头文件及全局变量声明如下:

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

模块初始化函数:

int __init find_symbol_init(void){
    const char * name = "symbol_A";                       //待查找的内核符号的名字
    struct kernel_symbol * ksymbol ;                      //用于接收测试函数返回值
    struct module * owner;                                  //内核符号所属的模块
    const unsigned long *crc;
    bool gplok = true;                                       //模块支持GPL许可
    bool warn = true;                                        //允许输出警告信息
    ksymbol = find_symbol(name, &owner, &crc, gplok, warn); //调用待测试函数
    if( ksymbol ! = NULL )
    {
        /*输出查找到的内核符号在内存中的地址*/
        printk("ksymbol->value : %lx\n", ksymbol->value);
        printk("ksymbol->name : %s\n", ksymbol->name);  //输出内核符号名字
    }
    else
        printk("Failed to find symbol %s\n", name);
     if( owner ! = NULL )
      {
           /*输出内核符号所属的模块的名字*/
           printk("owner->name : %s\n", owner->name);
      }
      if( crc ! = NULL )
      {
          /* 输出内核符号的crc值所在的地址*/
           printk("*crc : %lx\n", *crc);
       }
       return 0;}

模块退出函数:

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

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

module_init(find_symbol_init);
module_exit(find_symbol_exit);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值