从零写OS(三十八):SMP 启动 —— 唤醒第二颗 CPU
到目前为止,内核一直跑在单核上。这一章迈出多核的第一步:让所有 CPU 核心都进入内核。 验证结果: [acpi] MADT found, 2 CPU(s) [smp] booting AP lapic=1 [cpu0] online [cpu1] online [smp] all APs online, total CPUs=2 / # x86 多核启动的规则 x86 多核启动有一套固定规则。系统上电后只有一颗 CPU 跑起来,叫做 BSP(Bootstrap Processor)。其余的核心叫 AP(Application Processor),处于等待状态,需要 BSP 主动唤醒。 唤醒的方式是通过 LAPIC(Local APIC) 发送 IPI(Inter-Processor Interrupt)。每颗核心内置一个 LAPIC,是核间通信的硬件基础。 第一步:找到所有 CPU CPU 的信息藏在 ACPI MADT 表里。MADT(Multiple APIC Description Table)是固件写好放在内存里的一张表,描述了系统上有多少颗 CPU 以及每颗 CPU 的 LAPIC ID。 内核启动时扫描 MADT,把所有有效 CPU 的 LAPIC ID 记下来: void acpi_parse_madt(void) { madt_t *madt = acpi_find_table("APIC"); // 遍历所有条目,找 type=0 的 Processor Local APIC 条目 // 记录 lapic_id → cpu_lapic_ids[],ncpus++ } 第二步:发送 INIT + STARTUP IPI 唤醒 AP 的序列是固定的(来自 Intel SDM): ...