Linux编程的一般新手。
我试图通过共享内存与内核模块通信,但无法调用shmget()等用户应用程序中使用的函数;我已将kernel-headers和kernel-devel安装到内核模块源中,并将其包括在内,但这些头部不包含任何函数。
在内核中有使用共享内存的标准方法吗?
此外,任何关于如何在相同情况下使用套接字的提示都将非常有帮助。
使用发行版: CentOS 5.2内核: 2.6.18-92.1.22.e15
提前谢谢。
//添加//为了澄清,我正在尝试制作一个演示,它具有典型嵌入式linux项目的常见功能。最终目标是将其移植到LynxOS,看看在大型项目上这样做可能会出现什么样的问题。
目前演示的主要功能是多进程、管道、消息队列、共享内存、套接字、多线程。
它有一个用户应用程序和一个可加载的内核模块相互通信。用户应用程序内两个进程之间的管道和消息,以及用户应用程序和内核模块之间的共享内存和套接字。
如果我做的事情完全偏离了路线,请告诉我。
发布于 2009-02-05 07:43:54
你的目的在我看来不是很清楚。共享内存不是用户空间和内核空间之间通信的一种方式。如果您想访问一些内核分配的内存,一种方法是实现mmap系统调用。
如果你真的需要写一些内核代码,推荐的读物是:linux device driver third edition,第15章就是你想要的。
一旦你有了共享内存,你可能需要一种方法来做一些同步,即在内核中的一部分上工作,而在用户空间中使用另一部分。用户空间/内核共享内存的一个示例是V4L2 API。可以在LWN series中找到关于它的更友好的解释。
但是,如果您更具体地说明您想要做什么,您将在执行过程中收到更具体的帮助,如果您确实需要内核模块,您可以查看哪些内核代码,等等。
关于套接字,我不太了解,但你应该在谷歌上搜索linux +内核+ netlink。它用于通过“标准”套接字调用从用户空间与内核通信,但我真的不知道如何在模块中使用它。
发布于 2009-02-05 13:32:09
内核可以自动访问用户空间内存,在内核中已经有很多这样的例子(提示: open()需要访问用户空间来读取要打开的文件名)。
目前还不清楚您的用例是什么,请详细说明。
在用户空间和内核之间进行通信的正常方式是通过sys调用;您可以添加自己的调用(不一定推荐)或扩展一些现有的调用(字符设备上的ioctl是典型的)。
许多内核模块实现了设备特殊文件,这是(大多数)设备驱动程序所做的(除了网络接口,它不是Linux下的设备特殊文件)
发布于 2010-03-12 19:45:59
以下是你可以与内核mmap设备文件对话的方法(编写简单的设备驱动程序,或者你也可以使用fifo文件,Netlink套接字(网络堆栈),套接字(网络),或者写你的系统调用...如果你详细地告诉我你到底想要什么,我可以帮你更多。
https://stackoverflow.com/questions/514819
复制相似问题