BSP 和 AP 的启动路径分离

发布时间:2026/10/1 8:37:11
BSP 和 AP 的启动路径分离 /** Now that this CPU is running on its own stack, drop the realmode* protection. For the boot CPU the pointer is NULL!*/movq trampoline_lock(%rip), %raxtestq %rax, %raxjz .Lsetup_gdtmovl $0, (%rax)这段汇编代码是 Linux 内核启动流程中应用处理器AP解除对实模式代码保护的关键步骤确保其顺利进入保护模式。可以将代码拆解为三个核心逻辑部分并结合背景来理解。背景释放实模式锁在 x86 多核启动中所有 AP应用处理器在唤醒时最初都在实模式下运行。为了防止多个 CPU 同时争抢或破坏共享的实模式代码和数据trampoline内核使用了一个自旋锁spinlock来确保同一时刻只有一个 CPU 在执行这段代码。当 AP 成功切换到 64 位模式并拥有了自己的栈后它就需要释放这个锁以便唤醒下一个 AP 核心。这就是这段代码的最终目的。代码逻辑详解获取锁的地址movq trampoline_lock(%rip), %rax这行代码获取了名为trampoline_lock的锁变量的当前地址RIP-relative 寻址并存入%rax。检查锁是否有效testq %rax, %rax jz .Lsetup_gdttestq指令检查%rax是否为 0即NULL。如果%rax 0说明当前执行的是主 CPUBSP因为 BSP 是从 BIOS 直接启动的并不通过 trampoline 代码唤醒所以它没有持有这个锁直接跳转到.Lsetup_gdt继续执行。如果%rax ! 0则说明当前是 AP CPU需要执行释放锁的操作。释放锁movl $0, (%rax)这是释放锁的实际操作它将trampoline_lock指向的内存地址的值设置为0。这个动作会解除锁的保护并唤醒下一个在等待的 AP 核心。设计意图明确的职责分离这段代码体现了内核启动中一个重要的设计思路BSP 和 AP 的启动路径分离。BSP (Boot Strap Processor)在head_64.S中BSP 的入口会跳过锁释放的步骤直接进入 GDT 设置因为它从未占用过这个锁。AP (Application Processor)所有 AP 在secondary_startup_64中都会经过这段逻辑释放trampoline_lock确保唤醒机制的正确性和数据的一致性。trampoline_lock本身是一个在arch/x86/kernel/smpboot.c中定义的全局指针。这个设计确保了在复杂的多核启动过程中共享资源的访问是安全且有序的。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询