2.2.1 用户态、内核态的形成 -《zobolの操作系统学习札记》
内核态的出现,让计算机系统的权力向操作系统高度集中了。
操作系统分出内核态和用户态,就是为了进行不同等级的权限管理, 从而更好的适应多用户多任务并发的工作环境。
用户态和内核态的来源
在早期的单进程单用户操作系统中,是不存在两种用户态的。
随着进程和用户的出现,当时的计算机面临着一个重要问题,就是如何限制不同进程的操作的权限。(因为操作系统无法预测未来会出现什么样的进程)
把计算机内部想象成一个有条不紊的工厂,那必须在管理者和被管理者之间制定好规则,每个职位的权限都一定要确定好。
所以当时的工程师,就准备让一些危险的操作只允许操作系统的进程去做。如果其他用户进程想做这个操作,必须询先询问操作系统的意见。然后由操作系统去做,做完再把数据传给询问的用户进程。(比如I/O操作)
随着内核态的出现,操作系统进程/线程也正式凌驾于用户线程之上

权限本质就是可以做的事情不同。
CPU的内核态、用户态出现
如果只是操作系统对进程/线程的不同权限限制,还称不上“态”。但是随着操作系统权限限制功能的普及,CPU厂商也与时俱进,开始在硬件层进行权限限制。
操作系统厂商:CPU厂,现在我们都需要权限限制功能,能不能在硬件层做一个设计。软件层做不够安全,速度切换也较慢。
CPU厂商:好的,我在程序状态寄存器设计两位标志位,提供至少四个状态。你操作系统修改这个寄存器的状态位,我CPU就知道此时是什么权限等级了。

现代操作系统一般只使用最高ring 0和最低ring3,它们分别被成为内核态和用户态。
CPU会根据状态位的不同,限制可以执行的指令集,从而从硬件层做出限制。
操作系统通过修改CPU上寄存器的值,来做到切换权限,这种过程就是内核态和用户态的切换。
可见内核态、用户态是针对整个计算机系统来讲,而不是针对某个线程。
问1:我们如何定义高权限?
如果一个线程可以访问并修改计算机系统内的所有内存和寄存器。那么我们就认为这个线程具有最高的权限。
这种最高权限的线程,一般只属于操作系统。
问2:是所有的操作系统都分两种状态吗?
不是,早期的操作系统都不分两种状态,比如MS-DOS。分两种状态,是因为操作系统不得不面对 多用户权限多任务并发的 需要,而创建的。
问3:用户线程和内核线程跟内核态,用户态的关系
没什么关系。线程的切换必须是操作系统的高权限线程去决定(采用中断手段),不可能让普通线程自己去做。所以只要是线程的切换一定是在内核态进行的。
用户线程因为根本不是真正的线程,所以它在用户态的切换,本质只是一种伪切换。
用户线程、内核线程是真伪线程的关系。
内核态、用户态是权限高低的关系。
不建议说“一个线程此时在内核态”,因为内核态是对操作系统某时刻权限的描述。换成“操作系统此时处于内核态执行某个线程”更好。
例1:当某个线程向操作系统申请I/O操作的过程
- A线程因为权限不够,向操作系统申请I/O操作
- 操作系统同意,中断A线程。
- 操作系统修改CPU寄存器状态,使计算机进入内核态。
- 操作系统调用自身的高权限线程,执行I/O操作。(注意不是调用A线程去做)
- 修改CPU寄存器状态,使计算机进入用户态。
- 将数据送给A线程。
- 调用A线程。
内核态的出现源于多权限功能的设计,随着CPU厂商的硬件层面完善,正式形成。
内核态不仅限制了权限,而且操作系统一般情况下只允许自身的线程在内核态下工作。
计算机的权限进一步集中到操作系统之中,这促进了计算机体系结构的形成。
2.2.1 用户态、内核态的形成 -《zobolの操作系统学习札记》的更多相关文章
- 42.Linux应用调试-初步制作系统调用(用户态->内核态)
1首先来讲讲应用程序如何实现系统调用(用户态->内核态)? 我们以应用程序的write()函数为例: 1)首先用户态的write()函数会进入glibc库,里面会将write()转换为swi(S ...
- linux 用户态 内核态
http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在 ...
- 进程:linux用户态-内核态
用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permi ...
- GCC 用户态&内核态 Makefile
转了一圈,今天再次回到C 网上一篇博文,个人感觉良心作品,故而拿来重新实现一遍,原作者原文有问题,我这里把他打通了 一.GCC Makefile //hello.c #include <stdi ...
- 用户态和内核态&操作系统
用户态和内核态 内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序. 用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被 ...
- cpu内核态与用户态
1.操作系统需要两种CPU状态 内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序 2.指令划分 特权指令:只能由操作系统使用.用户程序不能使用的 ...
- 《Linux内核分析》课程第二周学习总结
姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- ucore操作系统学习(四) ucore lab4内核线程管理
1. ucore lab4介绍 什么是进程? 现代操作系统为了满足人们对于多道编程的需求,希望在计算机系统上能并发的同时运行多个程序,且彼此间互相不干扰.当一个程序受制于等待I/O完成等事件时,可以让 ...
- Linux用户态和内核态
究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...
随机推荐
- Java对象和多态
Java对象和多态 (面向对象) 面向对象基础 面向对象程序设计(Object Oriented Programming) 对象基于类创建,类相当于一个模板,对象就是根据模板创建出来的实体(就像做月饼 ...
- python向上取整以50为界
import math def getNum(limit_num,num): if num%limit_num==0: print(num) else: num=math.ceil(num/limit ...
- Logistic regression中regularization失败的解决方法探索(文末附解决后code)
在matlab中做Regularized logistic regression 原理: 我的代码: function [J, grad] = costFunctionReg(theta, X, y, ...
- AcWing 【算法提高课】笔记02——搜索
搜索进阶 22.4.14 (PS:还有 字串变换 A*两题 生日蛋糕 回转游戏 没做) 感觉暂时用不上 BFS 1. Flood Fill 在线性时间复杂度内,找到某个点所在的连通块 思路 统计连通块 ...
- 【大学物理实验】01 单摆测重力加速度 的 g 计算代码
单摆测重力加速度 传统摆 (代码没保存,就截了个图) 研究单摆周期与摆长之间的关系 (依旧是g的计算) 我还不太会数据拟合
- Java语言学习day08--7月7日
###13遍历数组 * A:遍历数组 * 在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历 * B:练习 public class ArrayDemo04 { publ ...
- 【远程文件浏览器】Unity+Lua开发调试利器
Remote File Explorer是一个跨平台的远程文件浏览器,用户通过Unity Editor就能操作运行在手机上的游戏或是应用的的目录文件.比如当项目打包运行到设备上时,可通过Remote ...
- Linux:文件解压、复制和移动的若干坑
Linux下进行文件的解压.复制.移动应该是最常见的操作了.尤其是我们在项目中使用大量的数据集文件(比如机器学习)时.然而使用这些命令时一不留神就会掉进坑里,这篇文章我们就来细数用Shell进行文件操 ...
- ASP.NET Web 应用 Docker踩坑历程
听说Docker这玩意挺长时间了,新建Web应用的时候,也注意到有个启用Docker的选项. 前两天扫了一眼<[大话云原生]煮饺子与docker.kubernetes之间的关系>,觉得有点 ...
- 使用allatori混淆代码
引言 为了保密需要,我们开发出来的程序在实际部署之前,需要先将jar包的代码进行混淆,让用户使用反编译也无法获得源码. allatori就是这样一个混淆java jar包代码的工具. 操作步骤 Ste ...