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)例 ...
随机推荐
- 1、【Python运维脚本】Python 按时间删除和清空文件
删除和清空文件,用shell的话一条命令就够了,Python要一堆命令. 但是为了学习Python,所以用于实战,就得这么干了. Python 按时间删除和清空文件 #!/usr/bin/python ...
- Kubernetes部署单元-Pod
在 k8s 搞出 pod 概念的时候,其实 docker 官方就已经推出自己的容器编排应用 swarm.这一套服务可以帮助在不同节点上的容器,进行统一的管理,主要针对容器的启停,运维,还有部署,注意我 ...
- switch 和 if else if else 有什么区别
1. 一般情况下,它们两个语句可以相互替换 2. switch..case语句通常处理case为比较确定值的情况,而if...else...语句更加灵活,常用于范围判断(大于.等于某个范围) 3. ...
- 【虚拟机】VMware-VMware Tool安装
1.安装 在VMware Workstation主界面点击菜单"虚拟机".会弹出提示框,点击是. 保持网络状态,等待后台下载,下载后会出现一个压缩包(如果没有出现压缩包请点击这里查 ...
- BootstrapBlazor实战 Menu 导航菜单使用(1)
实战BootstrapBlazorMenu 导航菜单的使用, 以及整合Freesql orm快速制作菜单项数据库后台维护页面 demo演示的是Sqlite驱动,FreeSql支持多种数据库,MySql ...
- 给swap分区扩容
一.先添加一块硬盘,如果硬盘空间还有没有被分区的也可以使用,再创建一个分区(分区可以是主分区或者扩展的逻辑分区) fdisk /dev/sdb n 代表创建分区 p 代表 ...
- netty系列之:netty中的核心解码器json
目录 简介 java中对json的支持 netty对json的解码 总结 简介 程序和程序之间的数据传输方式有很多,可以通过二进制协议来传输,比较流行的像是thrift协议或者google的proto ...
- XCTF练习题---MISC---glance-50
XCTF练习题---MISC---glance-50 flag:TWCTF{Bliss by Charles O'Rear} 解题步骤: 1.观察题目,下载附件 2.下载完成以后,隐隐约约像是一张动图 ...
- XCTF练习题---MISC---Janos-the-Ripper
XCTF练习题---MISC---János-the-Ripper flag:flag{ev3n::y0u::bru7us?!} 解题步骤: 1.观察题目,下载附件 2.发现是压缩包,进行解压,是一个 ...
- 用Docker打包Python运行环境
虽然Docker作为部署环境打包镜像的工具,和我的科研并没有直接的关系.但我觉得在项目中运用Docker来打包环境依赖也可以大大提高工作效率,于是准备专门学习一下Docker. 1. Docker基础 ...