【问题标题】:Communicating between Kernel Threads in LinuxLinux 内核线程之间的通信
【发布时间】:2009-09-18 02:03:05
【问题描述】:

我正在将一个应用程序/PCI 驱动程序从 vxWorks 移植到 Linux,如果可能的话,我希望保持相同的架构。当前驱动程序有 2 个使用消息队列相互通信的任务(线程)。内核线程之间是否有通信机制?消息队列用于传递缓冲区地址和大小信息,以便任务可以使用 DMA 移动大量数据。

【问题讨论】:

  • 为了清楚我所说的应用程序/PCI 驱动程序的含义,我将添加更多细节。用 vxWorks 编写的原始程序在内核级别完成所有工作。因此,设备的 PCI 驱动程序和作用于数据、打包和发送 UDP 的代码都在一个程序中。我试图保持相同的架构,因为应用程序将保留在 vxWorks 中,但由于资源和进度问题,我们需要移植到 linux 以继续测试。

标签: multithreading linux-kernel linux-device-driver


【解决方案1】:

听起来workqueue 接口可能是您所追求的——或者对于更轻量级的东西,kfifo 结合rwsem 信号量。

【讨论】:

  • 感谢咖啡馆。我今天将研究这两种机制,让您知道哪种最适合我。
  • kfifo 和 rwsem 似乎可以正常工作。再次感谢您。
【解决方案2】:

我强烈建议不要在 Linux 上保留 VxWorks 架构。内核线程扩散是不受欢迎的,你的代码永远不会进入官方内核树。即使您不关心这些,您是否 100% 确定要以非标准方式开发驱动程序?如果您摆脱这两个任务,事情会简单得多。顺便说一句,你到底为什么需要 PCI 驱动程序的任务?

【讨论】:

  • 感谢您的反馈。这是另一种管理层给出几乎不可能完成的任务,甚至更不可能完成的任务。战斗胜利了,我们不再这样做了。对任务的需求基于原始架构。驱动程序正在将大量数据从 PCI 卡中移出。数据被 DMA 发送到循环缓冲区,然后将消息发送到适当的任务以处理数据,以便下一次 DMA 发生。从那以后在 vxWorks 中,在 Linux 中没有,但他们不想更改它。
  • 现在,如果您绝对需要,您可以使用femtolinux.com 在 Linux 和 VxWorks 上保留一些单体架构 - 它允许在内核模式下运行用户应用程序,即以与 VxWorks 大致相同的方式
猜你喜欢
  • 2011-11-24
  • 2011-12-30
  • 2013-03-19
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多