FEATURED · 精选文章

BSP 和 AP 的启动路径分离

发布时间 / 2026/8/11 3:06:54
来源 / 创域科博编辑部
栏目 / 资讯中心
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中定义的全局指针。这个设计确保了在复杂的多核启动过程中共享资源的访问是安全且有序的。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻