3

一般是 Linux 编程的新手。

我正在尝试通过共享内存与内核模块通信,但无法调用用户应用程序中使用的函数,例如 shmget(); 我已经在内核模块源代码中安装了 kernel-headers 和 kernel-devel,并包含了,但是这些头文件不包含任何函数。

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

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

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

提前致谢。

//添加//为了澄清,我正在尝试制作一个具有典型嵌入式Linux项目共同特征的演示。最终目标是将其移植到 LynxOS 上,看看在大型项目中这样做会出现什么样的问题。

目前演示的主要特点是多进程、管道、消息队列、共享内存、套接字、多线程。

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

如果我正在做一些偏离课程的事情,请告诉我。

4

3 回答 3

3

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

如果你真的需要写一些内核代码,推荐阅读: linux device driver第三版,第15章就是你要找的。

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

但是,如果您更具体地了解您想要做什么,那么您会在执行此操作的过程中获得更具体的帮助,如果您真的需要一个内核模块,您可以查看哪些内核代码等等。

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

于 2009-02-05T07:43:54.137 回答
2

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

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

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

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

于 2009-02-05T13:32:08.627 回答
0

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

于 2010-03-12T11:45:58.803 回答