我认为您需要始终(或几乎始终)将蹦床加载到内核中。
在蹦床代码中,你需要这样的变量。
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;
}
需要 try_module_get() 来保护模块在调用 ip_vs_utils_afunc_ptr() 时不被突然卸载。你也可以使用 RCU 来减少 try_module_get()/module_put() 的开销。(但很难)
或者您可以在用户空间中使用一些类似蹦床的动态链接(您可能需要在 linux 内核中进行很多更改)