目录
-
- [1. CPU亲和性设置(MPIDR_EL1)](#1. CPU亲和性设置(MPIDR_EL1))
-
- [1.1 MPIDR_EL1寄存器详解](#1.1 MPIDR_EL1寄存器详解)
- [1.2 获取当前CPU ID](#1.2 获取当前CPU ID)
- [1.3 设置CPU亲和性](#1.3 设置CPU亲和性)
- [1.4 启动从核流程](#1.4 启动从核流程)
- [2. 核间通信(Mailbox)](#2. 核间通信(Mailbox))
-
- [2.1 Mailbox硬件架构](#2.1 Mailbox硬件架构)
- [2.2 ARM标准Mailbox实现](#2.2 ARM标准Mailbox实现)
- [2.3 消息传递协议](#2.3 消息传递协议)
- [2.4 关键操作代码](#2.4 关键操作代码)
- [2.5 同步机制](#2.5 同步机制)

1. CPU亲和性设置(MPIDR_EL1)
1.1 MPIDR_EL1寄存器详解
armasm
MRS <Xt>, MPIDR_EL1 ; 读取MPIDR_EL1到通用寄存器
- 位域结构 :
- Bit[31:24]: Affinity level 3 (多芯片系统)
- Bit[23:16]: Affinity level 2
- Bit[15:8]: Affinity level 1
- Bit[7:0]: Affinity level 0
- Bit[30]: U (1=Uniprocessor)
- Bit[40]: MT (1=多线程核心)
1.2 获取当前CPU ID
armasm
get_cpu_id:
MRS X0, MPIDR_EL1
AND X0, X0, #0xFF ; 提取Aff0字段
RET
1.3 设置CPU亲和性
c
// Linux内核示例
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(target_core, &cpuset);
sched_setaffinity(pid, sizeof(cpu_set_t), &cpuset);
1.4 启动从核流程
- 主核设置从核启动地址(
SCTLR_EL1
配置) - 通过
SEV
指令唤醒从核 - 从核执行
WFE
等待唤醒
2. 核间通信(Mailbox)
2.1 Mailbox硬件架构
- 典型实现 :
- 共享内存区域 + 门铃寄存器
- 每个核有独立收件箱/发件箱
- 支持中断或轮询模式
2.2 ARM标准Mailbox实现
armasm
/* 寄存器定义示例 */
#define MAILBOX_BASE 0x40000000
#define MAILBOX_WRITE (MAILBOX_BASE + 0x00) ; 写入数据
#define MAILBOX_READ (MAILBOX_BASE + 0x20) ; 读取数据
#define MAILBOX_STAT (MAILBOX_BASE + 0x40) ; 状态寄存器
2.3 消息传递协议
c
struct arm_mailbox_msg {
uint32_t magic; // 0xDEADBEEF
uint32_t cmd; // 命令字
uint64_t payload; // 数据负载
uint32_t checksum; // 校验和
};
2.4 关键操作代码
armasm
; 发送消息到指定核心
send_mailbox:
MOV W2, #0x1 ; 目标核心ID
LDR X1, =MAILBOX_WRITE
STR W2, [X1] ; 触发门铃中断
DSB SY
RET
; 接收消息处理
handle_mailbox:
LDR X0, =MAILBOX_READ
LDR W1, [X0] ; 读取消息
CBNZ W1, process_msg ; 非空则处理
RET
2.5 同步机制
- 自旋锁实现:
armasm
spin_lock:
MOV W2, #1
LDXR W1, [X0]
CBNZ W1, spin_lock
STXR W3, W2, [X0]
CBNZ W3, spin_lock
DMB SY
RET