两核 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 核之间缓存一致性

相关推荐
blueSatchel1 小时前
imx6ull显示控制器设备驱动解读
linux·嵌入式
Zwawa2 天前
让电机走到指定位置:编码器位置环 PID
c语言·单片机·嵌入式
奔跑的架构师2 天前
[A-51]ARMv9/v8-SCMI系统架构
linux·arm开发·架构·系统架构·arm
susplus2 天前
【Linux驱动开发】中断、工作队列及中断子系统详解
arm·中断·linux驱动开发·中断子系统
LCG米2 天前
STM32时钟树配置实测:HSE起振失败回退HSI、PLL分频倍频计算与Flash等待周期陷阱
stm32·单片机·嵌入式硬件·嵌入式
嵌入式分享2 天前
嵌入式分享#34:浅谈U-Boot (1)
嵌入式
LCG米2 天前
STM32 HardFault故障定位实测:压栈帧寄存器解析、CFSR故障源判读与出错地址回溯
前端·javascript·stm32·单片机·嵌入式
chu_bingzhi3 天前
ARMv8体系结构
arm
不会C语言的男孩3 天前
libxml2 源码编译与 XML 读取验证(x86 / ARM)
xml·c语言·嵌入式