对于mailbox,这个东西其实看到了很多次,但是一直不知道是啥。这里大概看了一下,知道了为甚有这个玩意儿,以及这个玩意相关的有啥,至于具体怎么使用,以及详细的工作原因等着以后再说吧。

正文

目前很多芯片都会有几个core核,有的是Cortex M0+、M4、M7、A53、A73等等,有的有着2核、3核、4核甚至6核8核,不同的核的主频支持度不一样,适用的具体应用场景也不同,因此需要IPC(Inter-processor communication)来核间通信,进行数据的交互。

核间通信(IPC)的主要目标是:充分利用硬件提供的机制,实现高效的CORE间通信;给需要CORE间通信的应用程序提供简洁高效的编程接口。

根据所使用的硬件特性,核间通信的实现机制有:

  • ·Mailbox中断

  • ·基于共享内存的消息队列


封装-VRING-解析的过程:1、应用程序向给定目的地(CPU、端点)发送消息2、消息首先从应用程序复制到两个CPU之间使用的VRING。此后,IPC 驱动程序在硬件邮箱中发布 VRING ID。3、这会触发目标 CPU 上的中断。在目标 CPU 的 ISR 中,它提取 VRING ID,然后根据 VRING ID 检查该 VRING 中的所有消息。4、如果收到消息,它从VRING中提取消息并将其放入目标RPMSG端点队列中。然后触发在此 RPMSG 端点上阻止的应用程序。5、应用程序处理接收到的消息,并使用相同的RPMSG 和VRING 机制在相反方向回复发送方CPU。

Hardware Mailbox

硬件邮箱主要用于提供具有小的 32 位有效负载的中断事件通知。

VRING 使用硬件邮箱在目标 CPU 上触发中断。每个邮箱包含 16 个单向 HW 队列,最多可连接 4 个通信用户或 CPU。

J721E SoC 有 12 个硬件邮箱实例。即 12x 16 个硬件邮箱队列。

Mailbox and VRING

邮箱本质上充当一个非常小的硬件队列,其中包含 VRING ID。

VRING 是共享内存中的 SW 队列,保存两个 CPU 之间传递的实际消息。当收到中断时,邮箱消息会告知从哪个 VRING 出列消息。

VRING ID=0 tells to look at the VRING from sender to receiverVRING ID=1 tells to look at the VRING from receiver to sender

散文

mailbox其实是多核处理器soc上,核与核之间互相发中断的机制,由于核与核之间可能存在不同的业务,故硬件上设计分配一两个中断已经无法满足业务的需求,软件拓展起来很困难,所以mailbox可以理解为软件可自由定义的中断模块。

用于在片上处理器之间通信的一种mailbox队列中断机制,mailbox队列中断机制允许软件通过一组寄存器关联的中断设置和得到信息在二个处理之间建立通信渠道。

核间通信的主要目标是:充分利用硬件提供的机制,实现高效的CORE间通信;给需要CORE间通信的应用程序提供简洁高效的编程接口。

根据所使用的硬件特性,核间通信可能的实现机制有:

  1.    Mailbox中断;
    
  2.    基于共享内存的消息队列;
    
  3.    POW + Group;
    
  4.    FAU;支持原子的读,写,fetch and add操作。
    

每个core有一个相应的32bit的mailbox寄存器,每一位可被单独地设置或清零。这对于core间的中断非常有用,任意core可直接通过其它core 的mailbox对其它core发出中断。当mailbox被置位时,相应core的中断寄存器也同时被置位,软件可实现其中断处理。

Bootloader支持Octeon_phy_mem_named_block_alloc( ),分配以名字命名的物理内存空间,不管是Service Executive应用程序还是linux kernel都可以通过Octeon_phy_mem_named_block_find( )找到这部分内存,实现core之间的共享数据。

Linux kernel也提供了共享内存的机制。主要有mmap(),系统V,Posix共享内存模型等。系统调用mmap()通过映射一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问。系统V共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面。posix共享内存区首先指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个以存在的共享内存区对象。然后调用mmap把这个共享内存区映射到调用进程的地址空间。传递给shm_open的名字参数随后由希望共享该内存区的任何其他进程使用。

核间通信方案

如下图所示ARM核和DSP核进行mailbox通信,ARM要发送数据给DSP:

  • 1 ARM核先往某个指定的共享内存空间buffer写入数据,然后MAILBOX触发中断和写入关于共享内存空间的地址信息给DSP。

  • 2 DSP通过得到mailbox中断的信息读取共享内存空间ARM核发送的buffer数据。

  • 3 DSP核读取完数据后将触发mailbox中断给ARM作为回应,告诉ARM核你发送的数据我已经接受完成了。 a

参考资料:

https://zhuanlan.zhihu.com/p/530307453
https://blog.csdn.net/tfnew21/article/details/4187148
https://blog.csdn.net/weixin_44316996/article/details/124363855

soc的核间通信机制-->mailbox相关推荐

  1. 【SemiDrive源码分析】【X9芯片启动流程】21 - MailBox 核间通信机制介绍(代码分析篇)之 Mailbox for Linux 篇

    [SemiDrive源码分析][X9芯片启动流程]21 - MailBox 核间通信机制介绍(代码分析篇)之 Mailbox for Linux 篇 一.Mailbox for Linux 驱动框架分 ...

  2. 【SemiDrive源码分析】【X9芯片启动流程】20 - MailBox 核间通信机制介绍(代码分析篇)之 MailBox for RTOS 篇

    [SemiDrive源码分析][X9芯片启动流程]20 - MailBox 核间通信机制介绍(代码分析篇)之 MailBox for RTOS 篇 一.Mailbox for RTOS 源码分析 1. ...

  3. 【SemiDrive源码分析】【X9芯片启动流程】19 - MailBox 核间通信机制介绍(理论篇)

    [SemiDrive源码分析][X9芯片启动流程]19 - MailBox 核间通信机制介绍(理论篇) 一.核间通信 二.核间通信软件架构 三.Mailbox 设备驱动 3.1 Mailbox for ...

  4. 【SemiDrive源码分析】【X9芯片启动流程】23 - MailBox 核间通信机制介绍(代码分析篇)之 RPMSG-IPCC Kernel 篇

    [SemiDrive源码分析][X9芯片启动流程]23 - MailBox 核间通信机制介绍(代码分析篇)之 RPMSG-IPCC Kernel 篇 一.RPMSG 接口 1.1 Linux Kern ...

  5. 【SemiDrive源码分析】【X9芯片启动流程】25 - MailBox 核间通信机制介绍(代码分析篇)之 RPMSG-IPCC RTOS QNX篇

    [SemiDrive源码分析][X9芯片启动流程]25 - MailBox 核间通信机制介绍(代码分析篇)之 RPMSG-IPCC RTOS & QNX篇 一.RPMSG 接口 1.1 Lin ...

  6. 多核异构核间通信-mailbox/RPMsg 介绍及实验

    1. 多核异构核间通信 由于MP157是一款多核异构的芯片,其中既包含的高性能的A7核及实时性强的M4内核,那么这两种处理器在工作时,怎么互相协调配合呢? 这就涉及到了核间通信的概念了. IPCC ( ...

  7. 【SemiDrive源码分析】【MailBox核间通信】42 - 基于Mailbox 实现的 mailbox_demo 应用程序(RTOS Android侧通信实现)

    [SemiDrive源码分析][MailBox核间通信]42 - 基于Mailbox 实现的 mailbox_demo 应用程序(RTOS & Android侧通信实现) 一.编写RTOS侧 ...

  8. 【SemiDrive源码分析】【MailBox核间通信】43 - 基于Mailbox IPCC RPC 实现核间通信(代码实现篇)

    [SemiDrive源码分析][MailBox核间通信]43 - 基于Mailbox IPCC RPC 实现核间通信(代码实现篇) 一.RTOS侧 IPCC RPC 代码实现 二.Android侧 I ...

  9. 异构核间通信mailbox原理研究

    mailbox原理 用于在片上处理器之间通信的一种mailbox队列中断机制,mailbox队列中断机制允许软件通过一组寄存器和关联的中断设置和得到信息在二个处理之间建立通信渠道. mailbox寄存 ...

最新文章

  1. 使用OGR创建dxf格式矢量数据
  2. 云计算情报局预告|告别 Kafka Streams,让轻量级流处理更加简单
  3. reactjs css modules解决组件间样式覆盖问题
  4. Salsify:高流畅度的实时视频传输新方式
  5. Linux网络模块全局变量,()不是Linux系统的特色.
  6. 欢迎广大技术爱好者参与JEECG开源项目
  7. leetcode题解173-二叉搜索树迭代器
  8. 纪念一个曾经的产品(目录)
  9. python:容器、迭代器、生成器 简单介绍
  10. 编写合格的C代码(1):通过编译选项将特定警告视为错误
  11. java各种加密算法_Java中的各种加密算法
  12. 电脑软件:推荐一款本地文档搜索神器,赶快下载试试吧!
  13. win7计算机怎么优化驱动器,win7电脑怎么优化
  14. 蔡勒(Zeller)公式及其推导:快速将任意日期转换为星期数
  15. 海信android电视直播软件,海信电视如何安装软件?四大方法搞定直播
  16. 2021中国科技大学计算机博士招生,中国科学技术大学2021年拟录取博士研究生名单公示,2661人!...
  17. Call Center核心词汇含义及功能
  18. visio绘制立方体
  19. ubuntu的gnome桌面重启
  20. mp3转成m4a的简单方法介绍

热门文章

  1. 您有接触过接各种传感器开关的展厅中控串口控制视频播放器吗?功能繁多,试看一下
  2. 无需客户端下载的方法/天翼云网页下载方法
  3. Electron教程
  4. 如何把PDF转换成CAD图纸呢?
  5. python 怎么做界面设计_python界面设计用什么
  6. arduino2560 digitalWrite原型分析
  7. 计算机大学实践报告范文,大学生计算机教学社会实践报告范文
  8. Arduino--MAX7219 LED点阵模块显示
  9. 删除无限循环的文件夹。
  10. 网络传输中的三张表,MAC地址表、ARP缓存表以及路由表