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)例 ...
随机推荐
- 帝国CMS灵动标签调用相关文章
标题包含关键字①.比较粗糙的匹配,可能不太精确:title like '%$navinfor[keyboard]%' ②.精确的匹配,比较消耗资源:title regexp '(^|,)$navinf ...
- 查域名对应ip,测试端口是否可访问通
根据命令查询软件包名称 yum provides */nslookup 根据域名解析ip nslookup 域名 示例:nslookup smtp.163.com 测试端口 telnet ip 端口 ...
- form表单请求
form 表单的acton属性指向url:端口号/(服务器get,post的参数), meyhod='get'/'post' 请求方式,必须要加上name属性. <form action=&q ...
- Java语言学习day23--7月29日
今日内容介绍1.构造方法2.this关键字3.super关键字4.综合案例 ###01构造方法引入 * A:构造方法的引入 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他 ...
- DOM 对象的重点核心
概述 : 文档对象模型(Document Object Model,简称DOM ),是W3C组织推荐的处理可扩展标记语言 (HTML或者XML)的标准编程接口. W3C已经定义了一系列的DOM接口, ...
- 理解ASP.NET Core - 授权(Authorization)
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 之前,我们已经了解了ASP.NET Core中的身份认证,现在,我们来聊一下授权. 老规矩,示 ...
- R语言_格兰因果检验
#当前文件路径 getwd() #设置当前路径,注意转译 setwd("C://Users//Administrator//Desktop//R_test") #导入数据 data ...
- Failed to load resource: the server responded with a status of 404 ()
今天遇到了一个一开始感觉很莫名其妙的报错 在编写页面的时候把原先写在html页面里的js代码单独拿出来做成一个JavaScriptUtil文件,放在了和html页面同一个目录下.运行之后在对应的页面c ...
- WebSocket 协议详解
一.WebSocket 协议背景 早期,在网站上推送消息给用户,只能通过轮询的方式或 Comet 技术.轮询就是浏览器每隔几秒钟向服务端发送 HTTP 请求,然后服务端返回消息给客户端. 轮询技术一般 ...
- 树莓派开发笔记(十三):入手研华ADVANTECH工控树莓派UNO-220套件(二):安装rtc等驱动
前言 前面运行了系统,本篇是安装对应套装的驱动,使rtc等外设生效,树莓派本身是不带rtc外设的. UNO-220-P4N1AE 驱动下载 官方下载:https://www.advan ...