【问题标题】:Methods of communicating between kernel and user apps内核和用户应用程序之间的通信方法
【发布时间】:2009-02-05 06:36:46
【问题描述】:

Linux 编程新手。

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

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

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

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

提前致谢。

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

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

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

如果我在做一些明显偏离路线的事情,请告诉我。

【问题讨论】:

    标签: linux ipc kernel-module


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的建议!我想制作一个演示程序,它使用在嵌入式 linux 项目中使用的典型功能。将通过编辑问题来澄清
    【解决方案2】:

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

    不清楚你的用例是什么,请更具体。

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

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

    【讨论】:

    • 谢谢你,将研究内核。
    【解决方案3】:

    以下是您可以与内核对话的方式 地图 设备文件(为您编写简单的设备驱动程序,或者您也使用 fifo 文件,Netlink 套接字(网络堆栈),套接字(网络),或编写您的系统调用......如果您详细告诉我您想要实现的目标可以为您提供更多帮助。

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 2011-12-30
      • 1970-01-01
      • 2014-11-06
      • 2012-12-13
      • 2011-05-25
      • 2012-01-28
      • 1970-01-01
      • 2011-03-11
      相关资源
      最近更新 更多