cpu学习笔记————特权资源与中断

CPU 学习笔记:特权资源与中断(x86 架构为主,2026 视角)

这是现代操作系统依赖的两大核心机制:特权级别(Privilege Levels)中断(Interrupts)。它们共同实现了“用户程序不能为所欲为”和“操作系统能及时响应外部事件”的基础。

1. 特权资源与特权级别(Privilege Levels / Rings)

x86/x86-64 架构将 CPU 运行权限分为 4 个环(Ring),目前实际只大量使用 Ring 0 和 Ring 3。

Ring名称典型运行代码能执行的指令类型能访问的资源当前特权级别(CPL)
0内核模式操作系统内核、驱动所有指令(包括特权指令)所有内存、所有 I/O 端口、所有 MSR、控制寄存器CPL=0
1(驱动层)极少数老系统驱动大部分特权指令受限访问CPL=1
2(驱动层)几乎不用大部分特权指令受限访问CPL=2
3用户模式普通应用程序非特权指令只能访问用户态内存、受限 I/OCPL=3

关键概念:CPL(Current Privilege Level)

  • 保存在 CS 寄存器的低 2 位(x86-64 仍然如此)
  • CPL=0 → 内核态,CPL=3 → 用户态
  • 数值越小,权限越高(0 > 3)

特权指令(Privileged Instructions)
只能在 CPL=0(Ring 0)执行,否则触发 General Protection Fault (#GP) 异常。

常见特权指令分类(高频考点):

类别典型指令作用只能 Ring 0 执行?
控制寄存器访问MOV to/from CR0/CR3/CR4/CR8开启/关闭分页、写保护、PAE 等
MSR 访问RDMSR / WRMSR读写 Model-Specific Registers(如 TSC、APIC)
段表加载LGDT / LIDT / LLDT / LTR加载 GDT、IDT、LDT、TSS
I/O 操作IN / OUT / INS / OUTS直接访问硬件端口
中断标志CLI / STI关/开中断(IF 标志)是(部分架构限制)
停机/等待HLT处理器暂停直到中断
模式切换相关MOV to/from CR0(PE 位)进入/退出保护模式
虚拟化相关VMXON / VMXOFF / VMLAUNCH 等Intel VT-x 虚拟化指令

用户态想做特权事 → 只能通过系统调用(syscall / int 0x80 / sysenter)

  • 触发软中断 / 快速系统调用指令
  • CPU 自动切换到 Ring 0 + 内核栈
  • 执行完再用 iret / sysret 返回 Ring 3

2. 中断(Interrupts)与异常(Exceptions)

中断:CPU 暂停当前指令,转而执行特定处理程序的异步/同步事件。

类型来源是否可屏蔽典型例子是否保存现场(自动)
异常(Fault/Abort/Trap)CPU 内部不可屏蔽#DE 除零、#PF 缺页、#GP 特权违规大部分是
硬件中断(External Interrupt)外部设备(经中断控制器)可屏蔽(IF 标志)键盘、定时器、网卡、磁盘完成
软中断(Software Interrupt)执行 INT n 指令可屏蔽系统调用(旧 int 0x80)、调试断点

x86-64 中断处理流程(简化版)

  1. 发生中断 / 异常 → CPU 自动保存部分现场(SS、RSP、RFLAGS、CS、RIP)到栈上(如果特权级变化则切换栈)
  2. 根据中断向量号(0~255)IDT(Interrupt Descriptor Table)
  3. IDT 每项是一个 门描述符(Gate Descriptor),常见三种:
  • Interrupt Gate(中断门):进入时自动 cli(关中断)
  • Trap Gate(陷阱门):进入时不关中断(系统调用常用)
  • Task Gate(任务门):基本废弃
  1. 跳转到门描述符指向的 中断处理程序(ISR – Interrupt Service Routine)
  2. ISR 执行完 → iret(中断返回指令)恢复现场 + 返回原特权级

IDT 关键寄存器

  • IDTR:指向 IDT 的基地址 + 限长(用 LIDT 加载)
  • 每个表项 16 字节(64 位模式)

中断向量号常见分配(部分)

向量类型名称说明
0异常#DE Divide Error除零
13异常#GP General Protection特权违规、非法指令等(最常见崩溃原因)
14异常#PF Page Fault缺页、权限不够
32~47硬件中断IRQ0~IRQ15传统 PIC 映射(现代用 APIC)
0x80软中断旧 Linux 系统调用已基本被 syscall 取代

3. 特权级与中断的交互关系(最核心)

  1. 用户态(Ring 3)执行特权指令 → #GP → 进入内核(Ring 0)处理 → 通常 kill 进程
  2. 硬件中断到来 → 不管当前是 Ring 0 还是 Ring 3,都切换到 Ring 0(由 IDT 门描述符的 DPL 决定,但内核一般设为 0)
  3. 系统调用(syscall / sysenter / int 0x80) → 故意从 Ring 3 → Ring 0
  4. 中断嵌套 → 现代内核一般在中断上下文禁用抢占,但允许更高优先级中断打断(NMI 不可屏蔽)
  5. 从 Ring 0 返回 Ring 3 → 只能用 iretq / sysret,不能用普通 ret(特权检查)

4. 现代关键变化(x86-64 + 2025–2026 视角)

  • syscall / sysret 取代 int 0x80(更快,无需 IDT 查表)
  • APIC 取代老 PIC(支持更多中断源、每个 CPU 独立)
  • NMI(不可屏蔽中断)用于 watchdog、硬件错误
  • Machine Check Exception (#MC) 用于 CPU 硬件错误报告
  • KPTI / Meltdown 补丁 → 内核页表与用户页表隔离
  • KVM / Intel VT-x → VM-exit / VM-entry 也算一种“特权中断”

一句话总结:

特权资源Ring 0 vs Ring 3 保护
中断 是 CPU 从“正在干活” → “紧急处理其他事”的快速通道
操作系统靠中断 + 特权级 + 页表保护 实现了多任务安全共存

需要更深入的部分(例如:IDT 具体结构图、syscall vs int 0x80 性能对比、Linux 中断上下文 vs 进程上下文、APIC 配置、异常栈切换等),可以直接告诉我~

文章已创建 4791

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部