如何在用户空间中调用内核级函数

如何在用户空间中调用内核级函数

我在内核中开发了一些辅助函数。它们由内核中的其他函数调用。目前,他们让我的自定义内核出现恐慌:(

为了调试,我将它们作为被动代码,仅位于内核中,对内核功能没有影响。我想知道是否有办法在构建和运行后在用户空间中调用这些函数?

答案1

这不是对你的问题的直接答案 - 我认为@BasileStarynkevitch是对的,一般来说,这不是你可以轻松/可靠地做到的事情,尽管至少在理论上,如果你的代码足够抽象(实际上并不在任何内核依赖项),那么我想您可以将其链接到存根用户空间进程并以这种方式进行测试。

话虽如此,内核确实提供了一些可能对您有用的东西 -UML(用户模式Linux)(请注意,在撰写本文时,此页面似乎因 sourceforge 基础设施问题而关闭 - 希望它很快就会恢复)

UML 是一种特殊的 Linux ARCH,它将整个内核构建为用户空间可执行文件。当这个可执行文件运行时,它会像内核通常那样启动,但全部包含在一个用户空间进程的空间内。这意味着您可以像任何其他用户空间进程一样将 GDB 直接挂接到 UML 进程中并正常调试,而无需摆弄内核调试器。

您至少需要以下内容:

  • 无论您使用什么内核风格,内核源代码树都是如此。
  • 使用 构建内核ARCH=um。无论您拥有什么内核和配置,这可能很容易,也可能不容易。详细步骤位于 sourceforge 页面(如果有)。还更多信息在这里
  • 为了启动这个内核,您还需要一个文件系统来引导它。有一些这里是预建的。请注意,并非所有文件系统都适用于所有内核,因此您可能必须明智地进行选择。
  • 我假设您的代码是内核模块的一部分。如果是这样,您还必须使用该模块来构建该模块,ARCH=um并在 UML 内核进程启动并运行后对其进行 insmod。

答案2

您无法轻松做到这一点(直接从用户空间调用内核函数)。从用户应用程序调用内核函数的规范方法是使用系统调用(2)

您可以制作一些内核模块 - 提供一些设备 - 通过设备的接口(即,read在该设备上)调用您的内核函数。writeioctl

您可以修补内核(但我不建议这样做)以添加调用内核函数的新系统调用。

您可能想在虚拟机管理程序或某些虚拟机中运行修补过的内核

你应该考虑使用插座(7)网络链接(7)这是 Linux 特有的功能,专为内核和用户态之间的通信而设计。

你需要花几周时间阅读文档使用该功能。看http://kernelnewbies.org/当然还要研究Linux的源代码核心

读也不错操作系统教科书

相关内容