1.CPU的内核态与用户态
CPU通常具有4个特权状态,现代 CPU通常定义了 4 个特权级别(Ring 0 ~ Ring 3),但主流操作系统(Linux、Windows、macOS)通常只使用其中两个,分别是ring3(最低)对应用户态。
ring0(最高)对应内核态,是最高特权级别,操作系统内核在此运行,可以直接访问所有硬件资源、执行特权指令(如操作内存管理单元、中断控制、I/O 端口访问等)。
Ring 3(用户态/用户模式):最低特权级别,普通应用程序在此运行,只能执行非特权指令,不能直接访问硬件或敏感系统资源。
在此基础上,划分用户空间和内核空间,内核空间和用户空间是内存的空间地址区域,其决定了当前代码能访问哪块内存。
2.内核空间与用户空间
在程序运行时,函数存储在用户空间的代码段内,程序在用户空间内只能执行普通指令,不能操控硬件,如果需要操控硬件,则需要使用系统调用(syscall)调用内核空间的函数,这些内核空间的函数也是预编译好的机器指令,和用户函数一样,区别在于内核空间的函数运行在CPU的内核态上。
┌─────────────────────────────────────────────────────────────┐
│ 用户空间 (User Space) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 浏览器 │ │ 微信 │ │ 你的App │ ← 用户态 (Ring 3) │
│ └─────────┘ └─────────┘ └─────────┘ │
│ 权限:只能执行普通指令,不能直接碰硬件 │
└─────────────────────────────────────────────────────────────┘
│
▼ 系统调用 (System Call)
│ (唯一合法的"穿越通道")
┌────────────────────────────────────────────────────────────────────┐
│ 内核空间 (Kernel Space) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 进程调度 │ │ 文件系统 │ │ 网络协议栈 │ │
│ │ 内存管理 │ │ 设备驱动 │ │ 中断处理 │ ← 内核态 (Ring 0) │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ 权限:执行特权指令,管理所有硬件资源 │
└────────────────────────────────────────────────────────────────────┘
│
▼ 驱动程序 + 特权指令
┌─────────────────────────────────────────────────────────────┐
│ 硬件层 (Hardware) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ CPU │ │ 内存 │ │ 磁盘 │ │ 网卡 │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ 真正的物理设备,被内核通过驱动直接操控 │
└─────────────────────────────────────────────────────────────┘
内核空间包含进程调度、内存管理和文件系统、各类驱动以及系统调用接口等,内核通过驱动程序将指令翻译为硬件操作,通过内存映射I/O (MMIO) 或端口I/O读写寄存器,从而实现对硬件的控制。同时,驱动程序还能注册中断处理函数,响应硬件发送过来的信号,设置DMA搬运数据。特别注意,系统调用接口位于内核空间,是内核暴露给用户空间的唯一官方接口。
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://zixblog.com/zix/linux%e5%9f%ba%e7%a1%80/cpuneiheyuyonghutaidequbieyuneicunkongjian/