当前位置: 首页 > 面试题库 >

Linux内核中模块的替代功能

淳于禄
2023-03-14
问题内容

在不深入了解 为什么
的细节的情况下,我正在寻找一种干净的(尽可能)的方法来替换可加载模块中的内核函数和系统调用。我最初的想法是编写一些代码来覆盖某些功能,这些功能将采用原始功能(可能的话,
调用 该功能),然后添加一些自己的代码。关键是我编写的函数必须具有原始函数的名称,因此其他代码在尝试访问它时将改为访问我的函数。

通过将代码放入适当的函数中,我可以轻松地(相对地)直接在内核中执行此操作,但是我想知道是否有人知道一点C魔术,但 不一定
是可以实现该目标的可怕的内核(或C)编码实践同样的结果。

我想到了#defines和typedef的想法,但我无法完全理解。

简而言之:有人知道一种有效地覆盖Linux内核中的功能(从模块)的方法吗?

编辑:由于被问到,我本质上是想 从内核中
记录某些功能(创建/删除目录等),但是出于理智的考虑,可加载模块似乎很有意义,而不是必须编写一个大补丁内核代码,并在每次更改时重新编译。可以向内核中添加最少的代码是可以的,但是我想将大部分工作卸载到模块上。


问题答案:

我意识到这个问题已有3年了,但是对于其他试图做这种事情的人来说,内核有一个名为kprobes的接口可以执行您需要的操作。



 类似资料:
  • 问题内容: 我在暑期研究中从事内核工作。我们希望在特定的RTT计算中对TCP进行修改。我想做的是将tcp_input.c中的功能之一的分辨率替换为由动态加载的内核模块提供的功能。我认为这将改善我们开发和分发修改的速度。 我感兴趣的函数被声明为静态的,但是我用非静态函数重新编译了内核,并由EXPORT_SYMBOL导出。这意味着该功能现在可供内核的其他模块/部分访问。我已经通过“ cat / pro

  • 主要内容:initramfe虚拟文件系统GRUB 加载了内核之后,内核首先会再进行二次系统的自检,而不一定使用 BIOS 检测的硬件信息。这时内核终于开始替代 BIOS 接管 Linux 的启动过程了。 内核完成再次系统自检之后,开始采用动态的方式加载每个硬件的模块,这个动态模块大家可以想象成硬件的驱动(默认 Linux 硬件的驱动是不需要手工安装的,如果是重要的功能,则会直接编译到内核当中;如果是非重要的功能,比如硬件驱动会编译为模块

  • 问题内容: 在Linux中开发内核模块时,不允许使用C标准库。 但是,如果我需要使用某些常用功能,例如,我应该去哪里? 问题答案: 无论Linux内核中没有实现什么,您都必须实现自己或从另一个开源内核模块中借鉴。但是,您会发现它是在内核中实现的。 请参阅内核API文档。特别是关于您的一般问题的“ 基本C库函数”部分,以及有关的特定问题的“ 字符串处理”部分。 您将要包含。 我不知道为什么内核API

  • 主要内容:内核模块保存位置与模块保存文件,内核模块的查看,内核模块的添加与删除Linux 的内核会在启动过程中自动检验和加载硬件与文件系统的驱动。一般这些驱动都是用模块的形式加载的,使用模块的形式保存驱动,可以不直接把驱动放入内核,有利于控制内核大小。 模块的全称是 动态可加载内核模块,它是具有独立功能的程序,可以被单独编译,但不能独立运行。模块是为内核或其他模块提供功能的代码集合。这些模块可以是 Linux 源码中自带的,也可以是由硬件厂商开发的(可以想象成驱动)。不过内

  • MANAGING THE LINUX KERNEL AND LOADABLE KERNEL MODULES 所有操作系统至少由两个主要组件组成。其中第一个也是最重要的是内核。 内核位于操作系统的中心,控制着操作系统所做的一切,包括管理内存,控制 CPU,甚至控制用户在屏幕上看到的内容。操作系统的第二个元素通常被称为用户区域,几乎包括其他所有元素。 内核被设计成一个受保护或特权的区域,只能由 roo

  • 问题内容: 我正在测试内核异步io函数(不是posix aio),并试图弄清楚它是如何工作的。下面的代码是一个完整的程序,其中我简单地将一个数组重复写入使用O_DIRECT打开的文件中。我在回调函数中收到一个错误“写错的字节期望1024得到0”(请参阅​​work_done()中的fprintf语句)。 对于不熟悉内核aio的用户,以下代码将执行以下操作: 初始化一些结构 准备AIO(io_pre