函数__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);