计算机基础(用户态与内核态)
计算机基础(用户态与内核态)
0.Linux 整体架构图
1.什么是用户态什么是内核态?
故事理解
张三是某科技公司的运维工程师(低权限),在 15 楼办公码代码,公司提供的资源仅有一套电脑(用户态)
张三,奋斗 5 年终于当上了sre工程师(高权限),之后张三搬到 30 楼,可以随时向资源部(系统调用)申请公司各种资源与获取公司的机密信息(内核态),所谓是走上人生巅峰。
我们发现,低权限的资源范围较小,高权限的资源范围更大,所谓的「用户态与内核态只是不同权限的资源范围」。
运行流程
2.概念具体解读
Inter 把
C P U 指令集
操作的权限由高到低划为 4 级:ring 0,ring 1,ring 2,ring 3
其中 ring 0 权限最高,可以使用所有 C P U 指令集
,ring 3 权限最低,仅能使用常规 C P U 指令集
,不能使用操作硬件资源的 C P U 指令集
,比如 I O
读写、网卡访问、申请内存都不行,Linux 系统仅采用 ring 0 和 ring 3 这 2 个权限。
高情商
- ring 0 被叫做内核态,完全在操作系统内核中运行
- ring 3 被叫做用户态,在应用程序中运行
低情商
- 执行内核空间的代码,具有 ring 0 保护级别,有对硬件的所有操作权限,可以行所有
C P U 指令集
,访问任意地址的内存,在内核模式下的任何异常都是灾难性的,将会导致整台机器停机 - 在用户模式下,具有 ring 3 保护级别,代码没有对硬件的直接控制权限,也不能直接访问地址的内存,程序是通过调用系统接口(System Call APIs)来达到访问硬件和内存,在这种保护模式下,即时程序发生崩溃也是可以恢复的
3.用户态与内核态的空间
- 用户态:只能操作
0-3G
范围的低位虚拟空间地址 - 内核态:
0-4G
范围的虚拟空间地址都可以操作,尤其是对3-4G
范围的高位虚拟空间地址必须由内核态去操作 - 补充:
3G-4G
部分大家是共享的(指所有进程的内核态逻辑地址是共享同一块内存地址),是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据
每个进程的 4G
虚拟空间地址,高位 1G
都是一样的,即内核空间。只有剩余的 3G
才归进程自己使用,换句话说就是, 高位 1G
的内核空间是被所有进程共享的!
4.用户态与内核态的切换
用户态和内核态切换的开销 大,大,大
什么情况会导致用户态到内核态切换?
- 系统调用:用户态进程主动切换到内核态的方式,用户态进程通过系统调用向操作系统申请资源完成工作,例如 fork()就是一个创建新进程的系统调用
- 异常:当 C P U 在执行用户态的进程时,发生了一些没有预知的异常,这时当前运行进程会切换到处理此异常的内核相关进程中,也就是切换到了内核态,如缺页异常
- 中断:当 C P U 在执行用户态的进程时,外围设备完成用户请求的操作后,会向 C P U 发出相应的中断信号,这时 C P U 会暂停执行下一条即将要执行的指令,转到与中断信号对应的处理程序去执行,也就是切换到了内核态。如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后边的操作等。
用户态和内核态如何相互切换?
内核态和用户态的切换主要通过中断和系统调用来实现。