本节摘要:为什么用户程序不能直接读写硬件、不能访问别人的内存?因为 CPU 的特权级(保护模式)把指令分级,关键操作只能内核做,用户程序通过中断(尤其系统调用)请求内核代劳。本节讲清两个核心概念:中断(硬件/软件事件打断 CPU,让它去处理)与保护模式/特权级(ring 0 内核、ring 3 用户,隔离用户与内核)。理解这两者,你就理解了操作系统的「脉搏」与「隔离墙」。
内容来源:基于 OS 内核机制整理的导读,呼应姊妹篇《Linux 命令》第 6 章信号与系统调用。
「中断」是 OS 的脉搏——没有中断,CPU 只会一直跑当前程序,无法切换(调度)、无法响应 IO(磁盘完成了不知道)。时钟中断让调度器有机会轮转 CPU;硬件中断让 OS 知道「IO 完成」。
「特权级」是隔离墙——让用户程序跑在受限的 ring 3,不能直接改页表、读写 IO,必须通过系统调用(触发软件中断进入 ring 0)请求内核。这才有「进程互不干扰」「系统不被某程序搞崩」。
理解这两者,你才真正理解 OS 如何实现「多任务 + 隔离」。
中断是「事件打断 CPU 当前执行,跳到中断处理程序」:
int 0x80 或 syscall)。同步。中断机制:CPU 维护一张「中断向量表」(每项是一个处理程序地址)。中断发生时,CPU 保存现场(寄存器)、查表跳到对应处理程序、处理完恢复现场返回。
x86 CPU 有 4 个特权级(ring 0-3),实际只用两个:
用户程序要读写硬件?不能直接做(在 ring 3 没权限)。它通过系统调用:syscall(或老式 int 0x80)触发软件中断,CPU 切到 ring 0,跳到内核的系统调用处理程序,内核代劳后返回 ring 3。这就是第 6 章 strace 看到的 open/read/connect 的来源——它们都是系统调用。
没有中断,OS 无法主动介入,只能让 CPU 一直跑当前程序——无法调度、无法响应 IO、无法实现虚拟内存。
写 OS 时:设中断向量表(IDT),写时钟中断处理程序(用于调度)、键盘中断处理程序(读键)、系统调用处理程序(syscall 入口)。理解「中断来了 → 保存现场 → 处理 → 恢复」的流程。
下一节讲调度与虚拟内存——OS 的两大核心抽象。