ARMv8 A55 多核簇,硬件层面:CPU1、CPU2 是对等的,没有硬件上的主 / 从之分。
所谓 "主次",是软件(Linux 内核)赋予的逻辑角色,不是硬件天生固定。
一、硬件层面:两个核完全对等(同 Cluster,共享 L2 Cache)
CPU1、CPU2:
- 各自独立私有 L1I/L1D 缓存、独立寄存器、独立 ALU 执行单元;
- 共享同一块 L2 Cache、共享总线接口访问 DDR;
- 硬件上能力一模一样,都可以运行操作系统内核、跑业务任务;
- 上电复位时:默认只有一个核先启动(这个叫 Boot CPU,也就是 CPU0),其余核(CPU1/CPU2/CPU3)处于 WFI(Wait For Interrupt)休眠等待状态。
重点:
上电阶段只有 CPU0 在跑 U-Boot、Linux 内核早期初始化;CPU1、CPU2 上电不会自动跑代码,一直等待内核发唤醒指令。 硬件上没有规定 CPU0 永远是老大,理论上可以配置从别的核启动,只是嵌入式 SOC 默认都是 CPU0 作为启动核。

二、Linux 内核视角:逻辑上区分「启动核 (主核)」和「应用核 (从核)」
1、CPU0:Boot CPU(引导主核)
- U-Boot 阶段:只有 CPU0 运行,CPU1/2 保持 WFI;
- Linux 内核解压、页表初始化、驱动初始化、调度器初始化全部都在 CPU0 上完成;
- 内核初始化完成后,CPU0 才会发送指令唤醒 CPU1、CPU2;
- 唤醒之后:CPU0 不再特殊,和 CPU1、CPU2 平等参与任务调度。
2、CPU1、CPU2:Secondary CPU(次级核)
- 唤醒前:WFI 休眠,几乎不耗电;
- 被内核唤醒后:初始化自身 MMU、L1 缓存,加入内核调度器;
- 唤醒完成后:和 CPU0 地位完全平等,内核调度器可以随意把任务分配到任意核。
总而言之:启动阶段有主次;内核跑起来之后,多核之间没有主次,是对称多核 SMP(Symmetric Multi-Processing)。 ARM Cortex‑A55 簇在 Linux 下就是标准 SMP 对称多处理器。
SMP 含义:所有 CPU 核共享一套内存空间(DDR),都能访问所有内存、外设;内核调度器统一调度任务。

三、CPU1 和 CPU2 怎么协同工作(SMP)
1. 任务调度(内核调度器)
Linux CFS 调度器负责把进程 / 线程分配到不同 CPU 核:
- 进程 A → CPU1
- 进程 B → CPU2 调度器会做负载均衡:哪个核空闲,就分配任务给谁;核负载高,就迁移任务到其他核。
也可以手动CPU 亲和性(affinity),把线程绑定固定核:
taskset -c 1 ./app # 强制程序跑在CPU1
taskset -c 2 ./app # 强制程序跑在CPU2
视觉项目常用:把业务算法绑到大核,把 VI/IVE 采集线程绑到指定核,减少核间迁移开销。
2. 核间数据同步(依靠共享 L2 Cache + Cache 一致性硬件)
CPU1 修改内存数据,存在自己 L1D(标记 dirty):
- 硬件 Cache 一致性协议(ARM ACE)会通过共享 L2 监听各个核的缓存;
- CPU2 读取同一块内存时,硬件自动探测到 CPU1 缓存里有最新脏数据;
- 自动完成缓存行迁移 / 失效,CPU2 拿到最新数据。
同簇 A55,硬件自动维护 Cache 一致性,软件不需要手动刷 cache 来做核间同步。
划重点区分:CPU 核 ↔ CPU 核之间:硬件自动 Cache 一致性(ACE 协议)
CPU 核 ↔ NPU/VI/DMA 加速器:硬件不自动维护一致性,必须软件手动刷 Cache
3. 核间通信方式
- 共享内存(最常用) :全局变量、共享内存,依靠硬件 Cache 一致性完成数据交互;配合互斥锁(mutex/spinlock)防止竞态。 锁:保证同一时刻只有一个 CPU 访问共享数据,避免数据错乱。
- 核间中断(IPI, Inter-Processor Interrupt) CPU1 可以发 IPI 中断给 CPU2,用来:
- 唤醒其他核
- 触发任务迁移
- 通知对方有事件需要处理 Linux 内核 SMP 大量依赖 IPI。
四、小结
1、上电 uboot 阶段:有主次,只有 CPU0 运行,其他核休眠等待唤醒
2、Linux 内核启动完成进入 SMP 之后:CPU0、CPU1、CPU2 硬件对等,没有主次
3、协同手段:
① 内核调度器分配任务、共享内存 + 锁交换数据、IPI 核间中断通知事件;
② 同簇 L2+ACE 硬件自动保证 CPU 核之间缓存一致性