linux-kernel - 保护多处理器中的共享内存区域

标签 linux-kernel multiprocessing

情况是我有 2 个板通过 PCIE 总线连接在一起。一 block 板是根端口,一 block 板是端点。端点端向根端口端导出内存区域。

两 block 板之间的通信是通过软件消息队列实现的。队列元数据和缓冲区都位于导出的内存区域内。

双方可以同时访问内存区域(根端口通过其 PCIE 总线,端点通过其本地总线)。当双方尝试更新队列元数据时,这可能会导致问题。

起初,我试图在同一个导出的内存区域上分配一个spinlock_t,但是因为每个板都是单处理器的,所以spinlock_t无论如何都没有分配。

任何人都可以建议一种保护共享区域的机制或推荐其他方法来在两个板之间进行通信。任何建议表示赞赏。非常感谢!

最佳答案

感谢您到目前为止的兴趣。

我们终于实现了循环队列的共享内存通信。实现可以引用这个link .我们将问题简化为单个生产者单个消费者,因此循环队列不需要锁来保护。这种方法的局限性是我们必须为每个对等连接创建一个队列。

在PCIE规范中,也有描述原子操作的部分,遗憾的是我们的PCIE主机 Controller 不支持这个特性,所以我们不能使用这个特性。

关于linux-kernel - 保护多处理器中的共享内存区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14352925/

相关文章:

c - 为什么 parent 应该死,在创建守护进程的过程中

linux-kernel - make[1] : *** No rule to make target `firmware/am335x-pm-firmware.bin' , 需要 `firmware/am335x-pm-firmware.bin.gen.o' 。停止

linux - 磁盘io队列溢出

c - 如何在linux内核中定义全局变量?

python - python 中奇怪的静默崩溃与 : OSX, 请求、sqlite3、多处理的组合

Python 多处理队列

linux - Linux内核中dts文件的多次修改

mysql - 单处理器系统中的多线程程序

python - 如何在函数内初始化并行独立进程?

linux - 如何初始化semaphore.h?