OpenAMP
时间轴
时间轴
2026-07-04
init
本文介绍了OpenAMP开放非对称多处理软件框架的背景及其在多核异构系统中的应用。本文详细讨论了Virtio、RPMsg和Remoteproc三大核心组件,并总结了基于共享内存与核间中断实现Linux主处理器与裸机或RTOS协处理器之间生命周期管理及消息通信的具体工作机制。
OpenAMP(开放非对称多处理)最初是由 Mentor Graphics 与 Xilinx 公司为解决 AMP 系统中的 RTOS 或者裸机程序与 Linux 接口能进行通信而开发的一个软件框架。目前 OpenAMP可用在 ST、NXP、TI 和 Xilinx 等平台上,这些厂商已经提供了移植好的 OpenAMP 的开发实例,用户可参考实例来进行开发。本文以 STM32Cube_FW_MP1_V1.2.0\Projects\STM32MP157C-DK2\Applications\OpenAMP 作为参考示例。
OpenAMP Project 官网
OpenAMP 官方文档
OpenAMP Github 开源仓库
The main OpenAMP library (implementing RPMSG, Virtio, and Remoteproc for RTOS etc)
STM32CubeMP1 MPU Firmware Package
- STM32MP157C-EV1 RevC
- STM32MP157C-DK2 RevC
OpenAMP 提供了 RPMsg, VirtIO, RemoteProc 的实现:
virtio
Virtio 是一个提供共享内存管理的虚拟设备框架,Virtio 中的 vring 是指向数据缓冲区指针的 FIFO 队列,有两个单向的 vring:
- 一个 vring 专用于发送到远程处理器的消息
- 另一个 vring 用于从远程处理器接收的消息
两个 vring 组成一个环形,A7 和 M4 的数据通过 vring 的缓冲区来共享,vring 的缓冲区就是两个处理器的共享内存(Shared memory,也可称为 IPC Buffers或者 Vring buffers)
在 ST 给的参考配置中,STM32MP157 共享的内存就在 SRAM3 中。如下图所示,处理器通过 vring 环形缓冲区完成数据流转发。
相关代码位于linux-5.10.256/drivers/virtio
rpmsg
RPMsg 框架如下图所示,可以看到 RPMsg 框架位于 Virtio 的上层,RPMsg(Remote
Processor Messaging)框架是一种基于 Virtio 的消息总线。 RPMsg可以通过Virtio在IPCC的协调下与远端进行消息通信,而Remote proc则在IPCC的控制下可以将固件等写入远端,或对远端的 生命周期 ,状态等进行控制。
由图可知OpenAMP底层使用到IPCC,参考:
在 Cortex-A7 上,RemoteProc 框架根据协处理器的固件资源表中的可用信息来激活基于 Linux 的进程间通信(IPC),RPMsg 服务是通过 RPMsg框架实现的,邮箱服务由邮箱驱动程序 stm32_ipcc 实现。
在 Cortex-M4 上,RPMsg 服务由OpenAMP 库实现,邮箱服务由 HAL_IPCC 驱动程序实现。
这里有一点绕,大概意思是跑linux的A核和裸机或者跑freertos的M核之间通过OpenAMP进行通信,A核和M核有对应设计的OpenAMP,但是两者之间是兼容的,只不过底层调用不同,如A邮箱驱动程序 stm32_ipcc 实现,M核邮箱服务由 HAL_IPCC 驱动程序实现。
在 ST 给的默认配置中,MCUSRAM 里的 SRAM3 区域有两个 vring,分别用于发送和接收的消息,Vring buffers 缓冲区就是共享的内存。RPMsg 框架基于 Virtio 的 vrings,它通过 Virtio 的 vrings 向远程处理器发送消息,或者从远程处理器接收消息,当新消息已经在共享内存中时,邮箱框架就会通知处理器已经有消息可以接收。
RPMsg 实际上是一种基于 Virtio 的消息总线,用于实现的是消息传递(传递核间数据),可以认为 RPMsg 是一个与远程处理器通信的通道,这个通道,我们也可以称它为 RPMsg 设备,每个通道都有一个本地源地址和远程目标地址,消息就可以在源地址和目标地址之间进行传输,其中通信过程如下图:
关于 RPMsg,参考:
基于这些软件框架,所有的数据都在 RPMsg 上传递,RPMsg 将数据传输到内核层的 RPMsg 客户端,再通过内核下的设备节点传输给用户空间。结合网络 TCP/IP 结构层级关系,共享的内存和核间中断相当于物理硬件层,Virtio 相当于 MAC 子层,而 RPMsg 相当于传输层,如下图所示:
remoteproc
对于具有非对称多处理的 SOC,不同的核心可能跑不同的操作系统,例如 STM32MP157的 Cortex-A7 运行 Linux 操作系统,Cortex-M4 可以运行 OneOS 操作系统或者裸机程序。
为了使运行 Linux 的主处理器与协处理器之间能够轻松通信,在 Linux3.4.X 版本以后就引入了 Remoteproc 核间通信框架,Remoteproc 框架是由 Texas Instrument 开发的,在此基础上 Mentor Graphics 公司开发了一种软件框架 OpenAMP,在这个框架下,主处理器上的 Linux 操作系统可以对远程处理器及其相关软件环境进行生命周期管理,即启动或关闭远程处理器。
我们以 STM32MP157 为例来看下 M4 和 A7 的 Remoteproc 框架,如下图所示:
Remoteproc 是通用远程处理框架部分,其作用是:
- A7 将 M4 固件映像的代码段和数据段加载到 M4 内存中,以便就地执行程序;
- 解析固件资源表以设置关联的资源(固件中各个段的起始地址和大小等信息,Virtio 设备特性、vring 地址、大小和对齐信息);
- 控制 M4 内核固件的启动和关闭;
- 为与 M4 的通信建立 RPMsg 通信通道;
- 提供监视和调试远程服务(使用 sysfs 和 debugfs 文件系统,这两个文件系统在开发板的 Linux 文件系统中已经默认配置好了,可开机即用)。
注意:对于RPMsg的通信会用到Mailbox,但是图中并没有很好地体现出来,所以大体流程可以理解为,Remoteproc可以直接将固件映射到M核中,消息传递是需要通过初始化后,建立了的通道来进行通信,图中RCC等在固件映像后通过stm32_rproc会自动配置,即stm32_rproc是Remoteproc的售后,会进行一系列后续操作
stm32_rproc 是远程处理器(M4 内核)的驱动程序,其作用是:
- 向 Remoteproc 框架注册供应商特定的功能(如回调函数部分);
- 处理和 M4 关联的平台资源(例如寄存器,看门狗,复位,时钟和存储器);
- 通过邮箱框架(Mailbox)将通知转发到 M4。
以上所说的固件就是 M4 的可执行文件,如 MDK 下编译好的 .axf 文件或 STM32CubeIDE下编译好的.elf 文件。
A7 称为主处理器,M4 称为协处理器或远程处理器,主处理器先启动,再引导协处理器启动:
- 主处理器可以通过 Remoteproc 框架先加载协处理器的固件,然后再解析固件资源表发布的信息来配置协处理器系统资源并创建 Virtio 设备
- 一旦主处理器上的 Remoteproc 加载并启动远程处理器的固件后,协处理器就得到运行。
- 协处理器启动后,此时双核之间还不能进行核间通信,这需要先创建 RPMsg 通道,并由主处理器发送第一条消息以后,双核之间才可以进行核间通信,才可以互发数据。
- 如果需要停止运行固件,主处理器也可以关闭固件,协处理器程序随即停止运行。总之,Remoteproc 框架实现了对远程协处理器生命周期的管理(LCM)和控制,如下图所示:
相关代码位于linux-5.10.256/drivers/remoteproc
总结
经过以上分析,OpenAMP 开源软件框架具有如下功能和特点:
- 提供远程处理器 (remote processor) 生命周期管理和处理器间通信功能;
- 提供可用于 RTOS 和裸机软件环境的独立库;
- 与上游 Linux Remoteproc、RPMsg 和 VirtIO 组件具有兼容性。
使用 OpenAMP 实现核间通信的过程:
假定主处理器已经在运行并且远程处理器处于某种状态,如待机或断电状态
- 主处理器基于 Remoteproc 框架,先将远程处理器的固件加载到内存中
- 然后主处理器启动远程处理器(运行固件)并等待它初始化完成,例如唤醒、解除复位、上电等
- 远程处理器初始化完成后通知主处理器
- 主处理器和远程处理器建立起 RPMsg 通信通道
- 通过 RPMsg 通道两者可进行核间通信。







