繁体   English   中英

如何仅在已编译的Linux内核模块中存在符号时才可选择使用导出的符号?

[英]How to use exported symbols optionally only if they are present in an insmoded Linux Kernel module?

我正在修改Linux内核以向Linux虚拟服务器(LVS)添加一些功能。

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

此模块在逻辑上不会一直加载。 我的目的是允许用户决定是否要使用此附加功能(加载或卸载模块)。

我的问题是如何从现有(当然还有修改过的)模块( net/netfilter/ipvs/ip_vs_core.c )中选择性地调用这些函数(取决于模块是否正在运行)。 像这样的东西:

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

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

在trampoline代码中,您需要这样的变量。

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;

并在trampoline代码中添加trampoline函数:

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()的开销。 (但很难)

或者你可以在用户空间中使用一些像trampoline-hack一样的动态链接(你可能需要在linux内核中进行大量更改)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM