如何在导入符号出现在已编译的Linux内核模块中时,可选地使用它们
我正在修改
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()来保护模块不被突然卸载. 或者你可以在用户空间中使用一些像trampoline-hack一样的动态链接(你可能需要在linux内核中进行大量更改) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |