当前位置:网站首页>用户态和内核态
用户态和内核态
2022-06-23 06:23:00 【summer_west_fish】
一、C P U 指令集权限
在说用户态与内核态之前,有必要说一下 CPU 指令集,指令集是 CPU 实现软件指挥硬件执行的媒介,具体来说每一条汇编语句都对应了一条 CPU 指令,而非常非常多的 CPU 指令 在一起,可以组成一个、甚至多个集合,指令的集合叫 CPU 指令集。
同时 CPU 指令集 有权限分级,大家试想,CPU 指令集 可以直接操作硬件的,要是因为指令操作的不规范`,造成的错误会影响整个计算机系统的。好比你写程序,因为对硬件操作不熟悉,导致操作系统内核、及其他所有正在运行的程序,都可能会因为操作失误而受到不可挽回的错误,最后只能重启计算机才行。
而对于硬件的操作是非常复杂的,参数众多,出问题的几率相当大,必须谨慎的进行操作,对开发人员来说是个艰巨的任务,还会增加负担,同时开发人员在这方面也不被信任,所以操作系统内核直接屏蔽开发人员对硬件操作的可能,都不让你碰到这些 CPU 指令集。
针对上面的需求,硬件设备商直接提供硬件级别的支持,做法就是对 CPU 指令集设置了权限,不同级别权限能使用的 CPU 指令集 是有限的,以 Intel CPU 为例,Inter把 CPU 指令集 操作的权限由高到低划为4级:

其中 ring 0 权限最高,可以使用所有 CPU 指令集,ring 3 权限最低,仅能使用常规 CPU 指令集,不能使用操作硬件资源的 CPU 指令集,比如 I O 读写、网卡访问、申请内存都不行,Linux系统仅采用ring 0 和 ring 3 这2个权限。
二、用户态与内核态
通关了CPU 指令集权限,现在再说用户态与内核态就十分简单了,用户态与内核态的概念就是CPU 指令集权限的区别,进程中要读写 IO,必然会用到 ring 0 级别的 CPU 指令集,而此时 CPU 的指令集操作权限只有 ring 3,为了可以操作ring 0 级别的 CPU 指令集, CPU 切换指令集操作权限级别为 ring 0,CPU再执行相应的ring 0 级别的 CPU 指令集(内核代码),执行的内核代码会使用当前进程的内核栈。
PS:每个进程都有两个栈,分别是用户栈与内核栈,对应用户态与内核态的使用。
1、用户态与内核态的空间
在内存资源上的使用,操作系统对用户态与内核态也做了限制,每个进程创建都会分配「虚拟空间地址」,以Linux32位操作系统为例,它的寻址空间范围是 4G(2的32次方),而操作系统会把虚拟控制地址划分为两部分,一部分为内核空间,另一部分为用户空间,高位的 1G(从虚拟地址 0xC0000000 到 0xFFFFFFFF)由内核使用,而低位的 3G(从虚拟地址 0x00000000 到 0xBFFFFFFF)由各个进程使用。

- 用户态:只能操作
0-3G范围的低位虚拟空间地址 - 内核态:
0-4G范围的虚拟空间地址都可以操作,尤其是对3-4G范围的高位虚拟空间地址必须由内核态去操作 - 补充:
3G-4G部分大家是共享的(指所有进程的内核态逻辑地址是共享同一块内存地址),是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据。
每个进程的 4G 虚拟空间地址,高位 1G 都是一样的,即内核空间。只有剩余的 3G 才归进程自己使用,换句话说就是, 高位 1G 的内核空间是被所有进程共享的!
最后做个小结,我们通过指令集权限区分用户态和内核态,还限制了内存资源的使用,操作系统为用户态与内核态划分了两块内存空间,给它们对应的指令集使用
2、用户态与内核态的切换
相信大家都听过这样的话「用户态和内核态切换的开销大」,但是它的开销大在那里呢?简单点来说有下面几点
- 保留用户态现场(上下文、寄存器、用户栈等)
- 复制用户态参数,用户栈切到内核栈,进入内核态
- 额外的检查(因为内核代码对用户不信任)
- 执行内核态代码
- 复制内核态代码执行结果,回到用户态
- 恢复用户态现场(上下文、寄存器、用户栈等)
实际上操作系统会比上述的更复杂,这里只是个大概,我们可以发现一次切换经历了「用户态 -> 内核态 -> 用户态」。
用户态要主动切换到内核态,那必须要有入口才行,实际上内核态是提供了统一的入口,下面是Linux整体架构图:

从上图我们可以看出来通过系统调用将Linux整个体系分为用户态和内核态,为了使应用程序访问到内核的资源,如CPU、内存、I/O,内核必须提供一组通用的访问接口,这些接口就叫系统调用。
库函数就是屏蔽这些复杂的底层实现细节,减轻程序员的负担,从而更加关注上层的逻辑实现,它对系统调用进行封装,提供简单的基本接口给程序员。
Shell顾名思义,就是外壳的意思,就好像把内核包裹起来的外壳,它是一种特殊的应用程序,俗称命令行。Shell也是可编程的,它有标准的Shell语法,符合其语法的文本叫Shell脚本,很多人都会用Shell脚本实现一些常用的功能,可以提高工作效率。
最后来说说,什么情况会导致用户态到内核态切换
系统调用:用户态进程主动切换到内核态的方式,用户态进程通过系统调用向操作系统申请资源完成工作,例如: fork() 就是一个创建新进程的系统调用,系统调用的机制核心使用了操作系统为用户特别开放的一个中断来实现,如Linux 的 int 80h 中断,也可以称为软中断
异常:当 CPU 在执行用户态的进程时,发生了一些没有预知的异常,这时当前运行进程会切换到处理此异常的内核相关进程中,也就是切换到了内核态,如缺页异常
中断:当 CPU 在执行用户态的进程时,外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执行下一条即将要执行的指令,转到与中断信号对应的处理程序去执行,也就是切换到了内核态。如:硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后边的操作等。
边栏推荐
- 322. change exchange
- C language learning summary
- Unet代码实现
- [bull Chinese document] queue package used to process distributed jobs and messages in nodejs
- [STL] summary of map usage of associated containers
- 深度学习系列46:人脸图像超分GFP-GAN
- 宝塔忘记密码
- 407 stack and queue (232. implementing queue with stack, 225. implementing stack with queue)
- Quartz调度框架的学习使用
- Side effects of threads in embedded real-time systems
猜你喜欢
![Don't look for [12 super easy-to-use Google plug-ins are here] (are you sure you want to take a look?)](/img/45/3e43faf7aba6741825ccb9719b8445.png)
Don't look for [12 super easy-to-use Google plug-ins are here] (are you sure you want to take a look?)
![[STL] unordered of associated container_ Map Usage Summary](/img/6a/d614f2f363fa5181c25e79ff8b0dab.png)
[STL] unordered of associated container_ Map Usage Summary

Idea automatically generates serialVersionUID

406-双指针(27. 移除元素、977.有序数组的平方、15. 三数之和、18. 四数之和)

How to migrate virtual machines from VirtualBox to hype-v

WPF command directive and inotifypropertychanged

GINet

MySQL MVCC多版本并发控制

junit单元测试报错org.junit.runners.model.InvalidTestClassError: Invalid test class ‘xxx‘ .No runnable meth

PSP代码实现
随机推荐
In depth learning series 47:stylegan summary
Specific help of OSI layered model to work
npm下载报错npm ERR code ERESOLVE
Verilog syntax explanation
深度学习系列47:超分模型Real-ESRGAN
.h5文件忘记数据库名字,使用h5py打印
TP6+Redis+think-queue+Supervisor实现进程常驻消息队列/job任务
【***数组***】
C DPI adaptation problem
TP6 安装拓展
别找了诸位 【十二款超级好用的谷歌插件都在这】(确定不来看看?)
MySQL重做日志 redo log
312. poke the balloon
System permission program cannot access SD card
About professional attitude
pspnet完整代码实现
316. 去除重复字母
Regular expression graph and text ultra detailed summary without rote memorization (Part 1)
[STL] summary of pair usage
QT designer cannot modify the window size, and cannot change the size by dragging the window with the mouse