OpenAMP专题(一):一文了解OpenAMP全貌
目录
一.概述
1.1 核心目标
1.2 核心设计
二.OpenAMP框架的核心组件
三.OpenAMP框架图
四.流程示例
4.1 初始化阶段
4.2 通信阶段
五.依赖关系总结
一.概述
OpenAMP(Open Asymmetric Multi-Processing)是一个开源框架,专为异构多核系统设计,用于实现不同处理器核心之间的通信与协同工作。它最初由Xilinx、STMicroelectronics等公司推动,现已成为Linux基金会管理的开源项目。
在AMP系统中,多个处理器核心运行不同的操作系统或软件环境(如Linux、RTOS或裸机程序),主处理器(Master Core)负责全局管理与任务调度,远程处理器(Remote Core)则执行特定任务。这种架构通过资源隔离和分工协作提升系统性能,尤其适合嵌入式实时系统和高性能计算场景。
1.1 核心目标
在非对称多核架构(如CPU + DSP、CPU + FPGA、CPU + Real-Time Core)中,提供标准化的远程处理器管理、通信协议和资源共享机制。
1.2 核心设计
基于标准化的组件和协议,如VirtIO、RPMsg和Remoteproc,适用于Linux、RTOS及裸机环境。
二.OpenAMP框架的核心组件
OpenAMP的核心功能由三大组件实现,涵盖生命周期管理、虚拟化IO及硬件抽象。
序号 | 组件 | 角色 | 描述 |
---|---|---|---|
1 | Remoteproc | 生命周期管理 | (1)负责远程处理器的启动、停止、固件加载及资源释放。例如,主核可通过RemoteProc类加载远程核的固件(如.elf文件),并触发其执行。 (2)支持动态配置内存地址,确保固件加载到正确位置,并初始化VirtIO和RPMsg设备。 |
2 | VirtIO | 虚拟化传输层 | 虚拟化I/O设备抽象,实现跨操作系统的设备共享。 (1)基于共享内存实现核间通信的底层数据传输,通过vring(虚拟环形缓冲区)管理数据交换。vring包含三个关键部分: ①缓冲区描述符池:描述共享内存中数据块的位置和长度; ②可用环形缓冲区(avail ring):写入者向接收者指示新数据的位置; ③已用环形缓冲区(used ring):接收者通知写入者数据已处理; (2)采用单写者单读者模式,避免多核竞争,无需信号量等同步机制。 |
3 | RPMsg | 消息传递协议 | (1)在VirtIO之上构建,提供标准化的消息传输接口。每个消息包含16字节头部(含源地址、目标地址、长度和标志位)和用户数据负载。 (2)支持动态创建通道(Channel)和端点(Endpoint),允许多个应用在同一通道上绑定不同回调函数,实现灵活通信。 |
三.OpenAMP框架图
笔者参阅相关资料及个人开发经验总结的框架图,可能有错漏。后面会根据学习认知的变化修正。
libmetal提供了一个统一的硬件抽象层和跨平台运行时支持,这使得基于 OpenAMP 的应用能够以相对一致的代码和逻辑,在 Linux 用户空间、各种实时操作系统(RTOS)乃至裸机环境中运行。
但在Linux和RTOS两种环境下存在以下功能差异:
四.流程示例
4.1 初始化阶段
1.Remoteproc驱动加载固件到从核内存 → 初始化VirtIO设备(配置vring地址)。
2.Libmetal在用户空间映射共享内存(如/dev/mem或UIO设备)。
4.2 通信阶段
1.主核发送数据
应用程序调用rpmsg_send() → RPMsg封装消息头 → VirtIO将数据写入vring → 触发中断通知从核
2.从核响应
从核处理数据后,通过vring返回响应 → VirtIO触发中断 → RPMsg驱动读取数据→ 用户空间通过回调或read()获取结果
五.依赖关系总结
1.垂直依赖
用户应用 → OpenAMP → Libmetal → 内核驱动(Remoteproc/VirtIO) → 硬件。
2.横向协作
(1)Libmetal与Remoteproc:共享内存地址需一致(通过设备树或动态协商)。
(2)RPMsg与VirtIO:共用同一vring配置,确保数据格式兼容。