在KLM和用户空间中归档

时间:2012-04-01 03:12:53

标签: c kernel-module

我记得在某个地方读过这个概念。我不记得在哪里。 我有一个文件说file.c,它与我编译的其他文件以及一些其他文件一起作为库供应用程序使用。

现在假设我编译相同的文件并使用内核模块构建它。因此现在相同的文件对象在用户空间和内核空间中,它允许我访问内核数据结构而不调用系统调用。我的意思是我可以在库中使用api,应用程序可以在没有系统调用的情况下访问内核数据结构。我不确定我是否可以在内核中写入任何东西(我认为这种方式是不可能的),但是以这种方式从内核读取一些数据结构会没问题吗?

任何人都可以向我提供有关此方法的更多详细信息。我在谷歌找不到任何关于此的内容。

2 个答案:

答案 0 :(得分:1)

我认为这是一个概念上有缺陷的方法,除非我误解了你在说什么。

如果我理解正确,你想要获取相同的文件并将其编译两次:一次作为模块,一次作为用户空间程序。然后你想要运行它们,以便它们可以共享内存。

因此,显而易见的问题是即使程序来自相同的源代码,它们仍然作为单独的可执行文件存在。该模块不是它自己的进程:它只会在内核启动时被调用(即系统调用)。所以它本身就不会让你逃避系统调用废话。

更好的解决方案取决于您的目标:您是否只是想访问内核数据结构,因为您需要一些通常无法获得的东西?或者,您是否关注性能并希望比系统调用更快地访问这些结构?

对于(1),您可以创建字符设备或procfs文件。这两个都允许你的用户空间程序将他们的脏手指伸进内核。

对于(2),你处在一个困难的地方,问题变得更加糟糕(并且更有趣)。要解决速度问题,它很大程度上取决于您要提取的确切数据。

这有帮助吗?

答案 1 :(得分:0)

有两种方法可以做到这一点,最常见的是所谓的字符设备,另一种是块设备(即“类似磁盘”的东西)。

Here's a guide关于如何创建注册chardevs的驱动程序。