只有当它们出现在insmoded Linux Kernel模块中时,如何使用导出的符号?

我正在修改一个Linux内核,将一些function添加到Linux虚拟服务器(LVS)。

我开发了一个模块(我称之为net/netfilter/ipvs/ip_vs_utils.c ),其中包含一些用于负载平衡的function。 这里所有的函数都使用EXPORT_SYMBOL()来导出。

这个模块在逻辑上并不是一直加载。 我的意图是让用户决定是否要使用这个附加function(加载或卸载模块)。

我的问题是,我怎样才能从现有的(当然是修改的)模块( net/netfilter/ipvs/ip_vs_core.c )中OPTIONALLY(取决于模块是否在运行)调用这些函数。 像这样的东西:

 if(ip_vs_utils_IsLoaded) { function1(arg1, arg2, arg3); // being function1 defined on ip_vs_utils.c } 

Solutions Collecting From Web of "只有当它们出现在insmoded Linux Kernel模块中时,如何使用导出的符号?"

我想你总是需要一个蹦床(或几乎总是)加载到内核。

在蹦床代码中,你需要这样的变量。

 struct module *ip_vs_utils_mod; EXPORT_SYMBOL(ip_vs_utils_mod); /* function pointers */ ret_type (*ip_vs_utils_afunc_ptr)(func_arg_list); /* Add static if you put it in a header file! */ EXPORT_SYMBOL(ip_vs_utils_afunc_ptr); /* ******EXPORTED***** */ 

当加载ip_vs_utils时,需要初始化ip_vs_utils.c中的所有变量,初始化代码:

 ip_vs_utils_mod = THIS_MODULE; /* init function pointers */ /* ip_vs_utils_afunc_impl is the real implementation * of the function, it is *****NOT***** needed to export it */ ip_vs_utils_afunc_ptr = ip_vs_utils_afunc_impl; 

并在蹦床代码中添加蹦床功能:

 ret_type ip_vs_utils_afunc(func_arg_list) { ret_type ret = DEFAULT_RET; if (try_module_get(ip_vs_utils_mod)) { ret = (*ip_vs_utils_afunc_ptr)(func_arg_list); module_put(ip_vs_utils_mod); } return ret; } 

在调用ip_vs_utils_afunc_ptr()的同时,需要try_module_get()来保护模块不被突然卸载。 您也可以使用RCU来减少try_module_get()/ module_put()的开销。 (但是很难)

或者你可以在用户空间中使用一些蹦床式的动态链接(你可能需要在linux内核中改变很多)