如何在导入符号出现在已编译的Linux内核模块中时,可选地使用它们?

如何在导入符号出现在已编译的Linux内核模块中时,可选地使用它们?,第1张

概述我正在修改 Linux内核以向 Linux虚拟服务器(LVS)添加一些功能. 我开发了一个模块(我称之为net / netfilter / ipvs / ip_vs_utils.c),其中包含一些在负载平衡时使用的函数.此处的所有函数都使用EXPORT_SYMBOL()导出. 此模块在逻辑上不会一直加载.我的目的是允许用户决定是否要使用此附加功能(加载或卸载模块). 我的问题是如何从现有(当然还有 我正在修改 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内核中进行大量更改)

总结

以上是内存溢出为你收集整理的如何在导入符号出现在已编译的Linux内核模块中时,可选地使用它们?全部内容,希望文章能够帮你解决如何在导入符号出现在已编译的Linux内核模块中时,可选地使用它们?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1029873.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存