ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Bootstrap Processor and Application Processor

Bootstrap Processor and Application Processor 在 Linux 内核以及其他 x86 操作系统的启动术语中BSP和AP是用来区分多核处理器SMP中不同 CPU 核心在启动时角色的标准术语。BSP (Bootstrap Processor引导处理器)角色它是系统的“主大脑”是唯一一个在系统上电或复位后由硬件自动唤醒并开始执行 BIOS/内核代码的 CPU 核心。职责执行所有初始化BSP 负责执行绝大部分的内核初始化工作包括内存管理、设备驱动加载、调度器初始化等。引导系统它负责运行我们之前讨论的整个启动流程从实模式到保护模式再到长模式最终进入start_kernel。唤醒 AP在完成自身初始化后BSP 会通过特殊的“启动间中断IPI”信号逐一唤醒其他所有 CPU 核心即 AP。AP (Application Processor应用处理器)角色指的是系统中除 BSP 以外的所有其他 CPU 核心。在系统上电时它们最初是处于休眠或等待状态的。职责执行初始化副本被 BSP 唤醒后每个 AP 都会执行一个与 BSP 不同的、简化的初始化路径通常从secondary_startup_64开始。加入系统它们会完成自身的堆栈设置、缓存初始化等然后进入等待队列准备为系统提供计算能力。它们在启动流程中的位置BSP从arch/x86/kernel/head_64.S中的startup_64入口开始一路执行到start_kernel。AP通过startup_64或secondary_startup_64入口被唤醒但在执行到我们之前分析的释放trampoline_lock的代码后它们会跳过 BSP 执行的大部分通用初始化直接进入各自的空闲循环准备执行调度器分配的任务。区分 BSP 和 AP 对于理解内核的启动机制至关重要。BSP 是“发起者”而 AP 是“追随者”这种设计确保了多核系统能够有序且高效地完成初始化。BSP是如何一步步唤醒AP并让它们最终加入系统的?整个过程主要由BSP在arch/x86/kernel/smpboot.c中的native_cpu_up()函数驱动。BSP的“四步舞曲”唤醒AP的流程BSP通过发送特殊的处理器间中断IPI来唤醒AP整个过程分为清晰的四个阶段发送INIT和SIPI信号这是唤醒的“敲门”动作。BSP首先向目标AP发送一个INIT初始化IPI让AP从休眠状态复位进入等待状态。接着BSP会发送一个或两个SIPI启动IPI信号。这个信号里包含了一个关键信息AP应该从哪里开始执行它的第一条指令——这个地址通常指向内存中的trampoline跳板代码。等待AP“签到”发送信号后BSP需要等待AP响应。AP在收到SIPI后会执行trampoline代码进入保护模式然后在内核的初始化过程中设置好自己对应的cpu_initialized_mask位相当于对BSP喊了一声“我收到了”。等待AP完成基础初始化BSP确认AP“签到”后会等待它完成自身核心的初始化。AP接着会进行CPU核心的初始化cpu_init()完成后会设置cpu_callin_mask位。这正是之前分析的那段释放trampoline_lock锁的代码所处的阶段。每个AP必须依次通过这个“锁”确保对trampoline代码的独占访问防止多核同时启动时的数据竞争。最终同步并标记上线最后一步是将AP完全纳入系统。BSP会和AP进行TSC时间戳计数器同步确保它们的时间基准一致。当所有准备就绪AP会设置cpu_online_mask位正式宣告自己“上线”成为系统可调度任务的一份子。AP的“觉醒之路”执行简化的初始化当AP被唤醒并执行trampoline代码后它会进入64位模式并跳转到内核为AP准备的专门入口secondary_startup_64。这是AP与BSP在代码层面的分水岭。secondary_startup_64会执行一个比BSP启动过程简化得多的初始化序列验证CPU检查CPU是否支持所需特性。加载自己的栈这正是之前分析的那段代码的任务AP会从current_task中获取并切换到自己的内核栈。释放trampoline_lock如果当前是AP它会释放这个锁好让下一个AP能开始启动。跳转到C代码最终AP会直接跳转到C语言函数start_secondary()开始执行更高级的初始化工作。在start_secondary()中AP会完成如设置per-CPU变量、初始化中断控制器等最终步骤然后进入空闲状态等待调度器分配任务。
返回列表