仅当导出的符号存在于 insmod 的 Linux 内核模块中时,如何选择性地使用它们?

2024-02-24

我正在修改 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
}

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

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

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;
}

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

或者你可以在用户空间中使用一些类似于动态链接的trampoline-hack(你可能需要在linux内核中进行很多更改)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅当导出的符号存在于 insmod 的 Linux 内核模块中时,如何选择性地使用它们? 的相关文章

  • 了解 Linux oom-killer 日志

    我的应用程序被 oom killer 杀死了 它是在实时 USB 上运行的 Ubuntu 11 10 无需交换 PC 具有 1 Gig 的 RAM 唯一运行的应用程序 除了所有内置的 Ubuntu 东西 是我的程序 flasherav 请注
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 使用 --prof 选项创建多个日志文件而不是一个 v8.log 的节点

    我正在尝试使用 prof 选项来分析我的 Node 应用程序 但我发现不是一个单一的 v8 log 文件 而是使用诸如isolate 0x9582b40 v8 log isolate 0xa1cab78 v8 6049 等前缀创建的多个文件
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na
  • 无法连接到 Azure Ubuntu VM - 公钥被拒绝

    我们在 Azure 上使用 Ubuntu VM 一段时间了 很少遇到任何问题 然而 其中一台虚拟机最近出现了问题 出乎意料的是 Ubuntu VM 开始拒绝公钥 ssh i azure key email protected cdn cgi
  • Linux 中有没有一种轻量级的方法来获取当前进程数?

    我希望我的 基于 C C 的 程序显示一个数字指示器 指示本地系统上当前有多少个进程 将经常查询正在运行的进程数值 例如每秒一次 以更新我的显示 有没有一种轻量级的方法来获取该数字 显然我可以调用 ps ax wc l 但我不想强迫计算机生
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规
  • GCC 详细模式输出解释

    我是 Linux 新手 谁能向我解释一下我的 hello world 程序的以下详细模式输出 另外 这些文件是做什么用的crt1 o crti o crtend o crtbegin o and crtn o and lc and lgcc
  • Linux 中的 Windows NAmed Pipes 替代品

    我们正在将现有的 Windows 代码移植到 Linux 我们使用 ACE 作为抽象层 我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作 linux 下这个相当于什么 我检查了linux命名管道 FIFO 但它们似乎只支
  • 虚拟内存澄清——大连续内存的分配

    我有一个应用程序 我必须在 Windows 上分配 使用运算符 new 相当大的内存空间 数百 MB 该应用程序是 32 位 我们现在不使用 64 位 即使在 64 位系统上也是如此 我启用了 LARGEADDRESSAWARE 链接器选项
  • 打印 STDOUT/STDERR 并将它们写入 Bash 中的文件?

    有没有办法让 Bash 将 STDOUT STDERR 重定向到文件 但仍然将它们打印到终端 这会将 STDOUT 和 STDERR 重定向到同一个文件 some command 2 gt 1 tee file log Example to
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • 使用 .htaccess 启用 PHP 短标签

    我在自己的 Centos 服务器上设置了 Apache 并具有多个虚拟 Web 服务器 并且我希望仅为位于以下位置的其中一个 Web 服务器启用 PHP 短标记 var www ostickets html 我可以通过添加成功启用短标签sh
  • 使用 Vala 和 GLib 的正则表达式

    有没有一个函数 比如http php net manual en function preg match all php http php net manual en function preg match all php 使用 GLibh
  • sudo pip install python-Levenshtein 失败,错误代码 1

    我正在尝试在 Linux 上安装 python Levenshtein 库 但每当我尝试通过以下方式安装它时 sudo pip install python Levenshtein 我收到此错误 命令 usr bin python c 导入
  • 设置 Vim 背景颜色

    当我尝试更改背景颜色时 vimrc或者直接在 Vim 中使用以下命令 set background dark 这根本不影响我的背景 也没有light选项 不过 当我运行 gvim 时 看起来还不错 有没有办法在不更改 Konsole 设置的
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul

随机推荐

  • Shiny布局,是否可以在Shiny中拥有左侧和骑侧边栏布局?

    在 Shiny 中可以有这样的布局吗 我理想地想要一个左侧和右侧边栏 我已经看到了一些解决方案shinydashboardPlus但这不正是我所追求的 我有一个与此示例结构类似的应用程序 mychoices lt c pick me A p
  • 如何在此处的集群地图中显示重复的制造商

    我在这里使用地图并使用聚类 但我在显示坐标相同 dublicate 的制造商时遇到问题 当我放大聚类时 不幸的是 制造商不可见 但聚类仍然可见 当集群缩放时如何显示这些标记 我的集群选项如下 var clusteredDataProvide
  • 使用 Rails5 和 ActionCable 时不允许请求来源:http://localhost:3001

    Rails 5 0 0 beta2 中尝试使用 ActionCable 的应用程序出现服务器问题 使用 localhost 3000 效果很好 因为这是大多数 ActionCable 的默认设置 但是如果我尝试在端口 3001 上运行 Ra
  • 有没有办法在 Azure DevOps 中创建组织仪表板?

    我们的团队目前正在使用 DevOps 并对一切的运行情况感到非常满意 我们在每个项目中设置了仪表板来跟踪工作项和冲刺 并希望在组织级别执行相同的操作 有没有办法创建组织中多个项目的总体概述 不幸的是 我们无法创建组织级别的仪表板 它不受支持
  • 将颜色从 Javascript 传递到片段着色器

    我目前正在学习webgl 有一个问题 我正在尝试制作一个三角形并将颜色信息从 js 文件传递 到片段着色器中 以下是我的js代码 var VSHADER SOURCE attribute vec4 a Position n attribut
  • Python - 通常如何使用递归方法将实例变量作为隐式参数传递给方法

    我在将对象的实例变量传递给实例方法时遇到问题 我在其他地方搜索过这个 但我一直找到的只是有关如何使用对象将对象传递给方法的信息self 我已经知道了 或者只是关于类和实例方法之间的一般差异的教程 但没有具体回答我的问题 我的问题的答案肯定存
  • CMake graphviz 自动生成

    我知道通过 CLI 生成 CMake 项目依赖关系图的常用方法 cmake graphviz file 但是有没有一种方法可以通过在 CMakeList 中设置标志或命令来自动生成它 这个想法是让 CMakeLists txt 本身触发图形
  • PHP递归函数返回值[重复]

    这个问题在这里已经有答案了 我在 PHP 中编写了一个递归函数来裁剪文本 裁剪后的文本将 附加到末尾 未裁剪的文本将以其原始状态返回 如果文本适合最大宽度 则该方法有效 但是 如果它不适合给定的宽度 该函数将不会返回值 但它应该返回 看来整
  • 更改默认拨号器的请求在某些设备上不显示系统对话框

    我们的应用程序需要成为默认拨号器应用程序 也称为 默认电话处理程序 默认呼叫应用程序 以便它能够在 Android 下拨打电话新的权限策略 https support google com googleplay android develo
  • 使用 Spring Hibernate 使用注释编写更少的 DAO

    我的 Spring Hibernate 配置文件很小而且非常紧凑 我使用自动扫描来查找我的模型实体 DAOS 我不想为层次结构中的每个实体编写 DAO DAOImpl 有些可能有资格拥有自己的 例如 如果他们与其他实体有复杂的关系并且需要的
  • ruby中使用数组进行数据库查询

    我正在尝试查找数组中具有值的所有行 这是我的代码 require sqlite3 db SQLite3 Database new test sqlite res db query SELECT w1 synsetid FROM words
  • 左、中、右对齐同一行底部的 div

    我想在同一行显示三个 div 这三个都有不同的宽度和高度 并且它们不是直文本 我想左对齐一个 一直到左边 右对齐另一个 一直到右边 然后将第三个居中 在包含 div 的中间 在本例中是整个页面 此外 我希望这三个 div 与包含的 div
  • 修复错误mysql服务器已经消失[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的 VPS 经常出现故障 MySQL 服务器已消失 错误 2006 并失去连接 我增加了 my cnf 中变量的值 但情况没有改善 这是我的 cnf
  • 静默 /dev/tcp/host/port 重定向错误

    以下脚本将测试从 8079 到 8081 的 tcp 端口是否打开或关闭 for port in 8079 8081 do echo gt dev tcp 127 0 0 1 port echo port port is open echo
  • 对齐双轴刻度时出现问题

    我创建了一个有 2 个 y 轴的 matplotlib 图 y 轴有不同的比例 但我希望刻度线和网格对齐 我从 Excel 文件中提取数据 因此无法事先知道最大限制 creates double y axis ax2 ax1 twinx l
  • .netcore 应用程序 wwwroot 之外的静态文件

    我在用着https github com ebekker ACMESharp https github com ebekker ACMESharp在我的 home 网络服务器上使用 SSL 它是免费的 O 这是相当手动的 但注意到在维基上它
  • bmp宽高比问题

    我一直在尝试了解 bmp 文件的工作原理 以便我可以渲染一些 Mandelbrot 设置图片并将它们输出为 bmp 文件 因为这似乎是最简单的方法之一 但由于某种原因 当我使用不是 1 的纵横比时 1 尽管它是 4 的幂 所以不需要填充 我
  • 创建纯 HTML 的自定义 ExtJS 的最佳方法

    所以我需要创建一个ExtJS组件 版本2 3 0 该组件只是简单的 HTML 样式化 它是一个标题 我当前的方法是创建一个自定义组件 如下所示 A ExtJS component for a header for the applicati
  • 获取设备的 IMEI 代码或/和 Mac 地址

    我正在实施一种唯一标识设备的方法 建筑师向我发送了以下规格 带 Wifi 3G 的设备 IMEI 代码 设备 仅 Wifi MacAddress 两者还需要制造商 型号来完成 ID 我的问题是 如何从设备获取 IMEI 如何从设备获取制造商
  • 仅当导出的符号存在于 insmod 的 Linux 内核模块中时,如何选择性地使用它们?

    我正在修改 Linux 内核以向 Linux 虚拟服务器 LVS 添加一些功能 我开发了一个模块 我称之为net netfilter ipvs ip vs utils c 以及负载平衡时要使用的一些函数 这里的所有函数都是使用导出的EXPO