两核 CPU:CPU1 和 CPU2 是如何协同工作的?

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):

  1. 硬件 Cache 一致性协议(ARM ACE)会通过共享 L2 监听各个核的缓存;
  2. CPU2 读取同一块内存时,硬件自动探测到 CPU1 缓存里有最新脏数据;
  3. 自动完成缓存行迁移 / 失效,CPU2 拿到最新数据。

同簇 A55,硬件自动维护 Cache 一致性,软件不需要手动刷 cache 来做核间同步。
划重点区分:

CPU 核 ↔ CPU 核之间:硬件自动 Cache 一致性(ACE 协议)

CPU 核 ↔ NPU/VI/DMA 加速器:硬件不自动维护一致性,必须软件手动刷 Cache

3. 核间通信方式

  1. 共享内存(最常用) :全局变量、共享内存,依靠硬件 Cache 一致性完成数据交互;配合互斥锁(mutex/spinlock)防止竞态。 锁:保证同一时刻只有一个 CPU 访问共享数据,避免数据错乱。
  2. 核间中断(IPI, Inter-Processor Interrupt) CPU1 可以发 IPI 中断给 CPU2,用来:
    • 唤醒其他核
    • 触发任务迁移
    • 通知对方有事件需要处理 Linux 内核 SMP 大量依赖 IPI。

四、小结

1、上电 uboot 阶段:有主次,只有 CPU0 运行,其他核休眠等待唤醒

2、Linux 内核启动完成进入 SMP 之后:CPU0、CPU1、CPU2 硬件对等,没有主次

3、协同手段:

① 内核调度器分配任务、共享内存 + 锁交换数据、IPI 核间中断通知事件;

② 同簇 L2+ACE 硬件自动保证 CPU 核之间缓存一致性

相关推荐
La Pulga20 小时前
【FreeRTOS源码学习笔记】任务延时列表
笔记·mcu·学习·嵌入式·freertos·实时操作系统
2035去旅行20 小时前
bootcmd 详细讲解
linux·嵌入式·arm·soc
蓝天居士20 小时前
EtherCAT从入门到精通(7)
机器人·嵌入式·ethercat
蓝天居士1 天前
EtherCAT从入门到精通(10)
机器人·嵌入式·ethercat
不脱发的程序猿1 天前
GD32串口数据收进内存之后DMA如何处理?
单片机·嵌入式硬件·dma·嵌入式·串口通信·gd32
lishen22 天前
06 · 我把开发流程拆成了 AI 能执行的技能
嵌入式
LONGZHIQIN2 天前
STM32学习笔记
笔记·stm32·学习·arm
§ꦿCFོ༉2 天前
嵌入式八股文—C语言入门学习(二)
c语言·学习·嵌入式·编程语言
Zwawa3 天前
两根线怎么挂住一堆设备:I2C 协议原理
c语言·单片机·嵌入式
欧西3 天前
零成本做一颗芯片:我用 OpenLane 把 SHA-256 从 Verilog 做到了 GDS
开源·嵌入式