Skip to content

导引:点亮什么、为什么

上一章备好了 IPI 发令枪,本章把发令枪真按下去。两件事:一是写一段 trampoline,把第二个核从 16 位实模式一路拉到 64 位长模式、让它跑起来;二是让多核调度真正干活——AP 不再干站着 halt,而是从一个共享的 run queue 里拉任务跑。这条路中间有个藏得很深的迁移 GP,还有 AP 真跑线程之后才暴露出来的一批并发债。验证点:-smp 2 启动,AP1 经 trampoline 上线、从共享队列拉到任务。

诚实交代在前:本机的 QEMU 下,-smp 2 真机会在 AHCI 驱动上踩一个时序竞态(单核完全正常),所以"两个核真跑用户任务"的端到端演示在本机受这个竞态挡住、跑不到那一步。AP boot 和调度机制本身是工作的——经单元测试 + 启动日志([AP1] online)验证;那个 AHCI 竞态是另一码事,本章末尾会讲清它的边界。

这章咱们要点亮什么

  1. AP boot trampoline:16 位实模式 → 32 位保护 → 64 位长模式,靠一套临时 GDT 和临时页表,BSP 往 trampoline 里塞好参数。
  2. AP 的 C 入口:锚定 GS、装本核 GDT、开 LAPIC、向 BSP 报到,再切进自己的 idle 任务。
  3. 共享 run queue 怎么不撞车:pick_next 把任务拿走、不留队列里,两个核绝不会抢到同一个任务。
  4. reschedule IPI + AP idle 循环:AP 空闲时 sti;hlt,被 IPI 唤醒后回头查队列、有活就干。
  5. 迁移 GP:一个 GDT 加载顺序的致命坑——讲清它怎么把 GS 锚点清零。
  6. AP 真跑线程后清算的并发债:原子引用计数、锁序图死锁检测。

035_multi_terminal-45-gf25de18 · f25de18 · 2026-08-04