内核和用户应用程序之间的通信方法

时间:2009-02-05 06:36:46

标签: linux ipc kernel-module

一般的Linux编程新手。

我试图通过共享内存与内核模块通信,但无法调用用户应用程序中使用的函数,如shmget(); 我已经安装了kernel-headers和kernel-devel,并且包含了 到内核​​模块源,但标题不包含任何函数。

在内核中是否有使用共享内存的标准方法?

此外,任何有关如何在相同情况下使用套接字的提示都会有很大帮助。

使用 发行版:CentOS 5.2 内核:2.6.18-92.1.22.e15

提前致谢。

// //添加 为了澄清,我正在尝试制作一个具有典型嵌入式功能的演示 linux项目。最终目标是将其移植到LynxOS以查看可能出现的问题 在大型项目上这样做。

目前该演示的主要功能是 多进程,管道,消息问题,共享内存,套接字,多线程。

它有一个用户应用程序和一个可加载的内核模块相互通信。 用户应用程序中的两个进程之间的管道和消息,以及共享内存和 用户应用程序和内核模块之间的套接字。

如果我正在做一些简单的事情,请告诉我。

3 个答案:

答案 0 :(得分:3)

你的目的对我来说不是很清楚。共享内存不是用户空间和内核空间之间通信的方式。如果你想访问一些内核分配的内存,一种方法是实现mmap系统调用。

如果你真的需要编写一些内核代码,建议阅读是: linux device driver third edition,第15章就是你要找的那个。

一旦你有共享内存,你可能需要一种方法来进行一些同步,即在内核中的一个部分上工作,同时在用户空间中使用另一个部分。用户空间/内核共享内存的示例是V4L2 API。可以在LWN series中找到更友好的解释。

但是,如果您对要做的事情更具体,那么如果您真的需要内核模块,您可以查看哪些内核代码等等,您将获得更多具体的帮助。

对于socket事物,我不太了解,但你应该google for linux + kernel + netlink。它用于通过“标准”套接字调用从用户空间与内核通信,但我真的不知道如何在模块中使用它。

答案 1 :(得分:2)

内核可以自动访问用户空间内存,内核中已经有很多这样的例子(提示:open()需要访问用户空间来读取文件名才能打开)

目前尚不清楚您的用例是什么,请更具体。

用户空间和内核之间正常的通信方式是通过sys调用;你可以添加自己的(不一定推荐)或扩展一些现有的(典型的字符设备上的ioctl)。

许多内核模块实现了一个设备专用文件,这是(大多数)设备驱动程序所做的(网络接口除外,它们不是Linux下的设备专用文件)

答案 2 :(得分:0)

以下是您可以与内核通信的方式 MMAP       设备文件(写你简单的设备驱动程序,或者你也使用fifo文件,Netlink套接字(网络堆栈),套接字(网络),或写你的系统调用...如果你详细告诉我你想要实现什么我想要实现可以帮助你更多。