从零写OS(四十):per-CPU 调度器 —— 每核一个时钟

ch39 加了锁,数据安全了。但调度器还有个问题:PIT(8253 定时器)是系统里唯一的一个,只有 CPU0 能收到 IRQ0。AP 没有定时中断,没法触发调度。 这章做两件事: 用 LAPIC 定时器替代 PIT,每颗核心独立触发调度 把 current_proc 改成 per-CPU 变量,每颗核各自记录自己在跑哪个进程 全局 current_proc 的灾难 int current_proc = 0; // 全局变量 // CPU0 把它改成 3(选中进程3) // CPU1 同时把它改成 5 // CPU0 接着继续,以为自己在跑进程3,实际内存里已经是 5 // → 崩溃 解决方法是每颗核心维护自己的 current_proc,互不干扰: typedef struct { int cpu_id; int current_proc; } cpu_t; cpu_t cpus[MAX_CPUS]; static inline cpu_t *this_cpu(void) { // 读 LAPIC ID → 查表 → 返回本核的 cpu_t int lid = lapic_id(); for (int i = 0; i < ncpus; i++) if (cpu_lapic_ids[i] == lid) return &cpus[i]; return &cpus[0]; } #define CUR_PROC (this_cpu()->current_proc) 所有原来用 current_proc 的地方改成 CUR_PROC。CPU0 修改自己的,CPU1 修改自己的,互不干扰。 ...

June 4, 2026 · 2 min · 大飞
京ICP备14031575号-3