知乎热问:进入内核态究竟是什么意思?

‍‍

知乎上有一个问题:

进入内核态究竟是什么意思?

暂且忘记这个问题,让我们从另一个问题出发,一步步引出这个问题的答案。

特权指令问题

现代计算机里面,同时运行了很多程序,比如Office软件、浏览器、QQ、还有你现在正在看这篇文章的微信,这些程序运行起来就是一个个的进程,每个进程都有各自的内存地址空间,为了防止大家越界,大打出手乱了规矩,得要有个管家来管理大家,这个管家就是操作系统

好了,不管是前面说的那些应用程序,还是操作系统,本质上都是CPU去执行的二进制程序指令吧,而一个CPU能够执行的所有指令都在它的指令集里面了。

试想一下,假如指令集中的所有指令都一视同仁,任何程序都可以使用这些指令,那会出现什么问题?

那操作系统的权威性如何保证?怎么管理这一堆进程,还不反了天了?因为谁都可以执行这些指令,大家都是平起平坐啊!

所以,必须将指令集中的一部分比较敏感的划出来,这部分只能让操作系统来执行,其他程序不能执行,以此来捍卫操作系统的地位!

哪些指令比较敏感?

涉及到操作系统管理计算机资源的指令就是敏感指令。

以x86架构的CPU为例,中断的打开与关闭、外部设备的输入与输出、进程地址空间基地址CR3寄存器的修改、中断描述符表IDT基地址寄存器的修改、全局描述符表GDT基地址寄存器的修改···这些都是敏感操作,是普通应用程序绝对不能碰的指令:

cli
sti
in
out
lidt
lgdt
···

那如何做到让这些敏感指令操作系统能够执行,而普通程序又不能执行呢?

CPU在执行指令的时候又没办法区分这条指令是应用程序的还是操作系统的,它只是一个没有感情的执行机器,只会闷头执行···

为了解决这个问题,x86 CPU搞了个特权级出来,或者说是CPU提供了四个工作模式,从Ring0-Ring3,每一个模式又称为一个环,一共四个环。0环是最高权限模式,可以执行所有指令。Ring3是最低权限模式,只能执行指令集中的一部分指令。

也就是说,CPU搞了四个工作模式出来,只有工作在Ring0模式下,才能执行上面的那些特权指令,在其他模式下如果要去执行那些指令,CPU就会抛出异常!

有了CPU的这一硬件技术支持,问题就好办了,我们可以让CPU在执行操作系统代码的时候运行在Ring0模式,在执行普通应用程序代码的时候运行在Ring3模式,这样就解决了特权指令的问题。

内核地址空间

但这里又回到之前那个问题了:CPU如何知道现在执行的代码是不是操作系统的呢?

一个最容易想到的解决办法就是:把操作系统的代码放在内存中一个特殊的区域,当CPU执行的指令地址来自这个区域时,就切换工作模式到Ring0,离开这个区域后,就切换到其他模式。

光这样还不够,还得加一个措施:这个区域不能让应用程序来访问,否则谁都能来读写,那还了得?

所以,除了指令增加特权级以外,在内存的访问上,也得加上特权级。

x86架构的CPU是基于分段式+分页式相结合的内存管理方式,所以Intel倒腾了几下,给不同的内存段限定了不同的访问模式,并把它记录到了段的描述符中。

在访问内存的时候,CPU就会拿当前段寄存器中标示的权限和要访问的目标内存所在段段访问权限进行对比,符合要求才能访问,否则也会抛出异常!

上面这一部分有一些抽象了,简单来说,操作系统在内存中圈了一块地,把自己的代码放在这块地中,并设置了访问权限:闲人免进,非Ring0权限禁止入内。

随后,操作系统又把自己圈的这块地映射到了每一个进程的虚拟地址空间中,这样一来,所有进程抬头一看自己的进程地址空间,都会看到它了:好家伙,这一块区域被操作系统占了,咱也不敢写,咱也不敢看。

操作系统圈的这块地,就是内核地址空间!一般位于进程地址空间中较高的区域,以32位下Windows为例,它是在0x80000000~0xFFFFFFFF这个区域。

我们把位于这个空间中的代码叫做操作系统的内核代码,有时候也简称内核。而把应用程序代码所活动的区域叫做用户地址空间

进一步,我们常把CPU执行内核代码的模式称为内核态,把执行用户程序时的模式称为用户态

CPU执行代码的过程,就是不断游走于用户态和内核态的过程。

进入和离开

现在还有最后一个问题:内核态的进入和离开怎么实现?

假如没有任何约束,那普通应用程序,不是随便执行一条jmp指令就能跳进内核地址空间执行了?

应用程序可以随便进进出出,高兴了就来一个内核一日游,那还不天下大乱了?

况且话说回来,内核所在的内存空间因为权限保护,应用程序也是没办法jmp过去的,前面不说了吗:闲人免进!

那怎么办呢?

CPU提供了专门的入口,用来从用户态进入内核态。

这几个入口是:

1、中断:

当硬件设备有消息来了之后,会通过中断通知CPU,比如你移动了鼠标,敲下了键盘,收到了一个数据包,收到了时钟的滴答声···

当中断发生时,CPU会将当前执行的上下文保存到栈中,转入内核执行中断处理程序。

通过中断进入内核,入口是记录在中断描述符表IDT中的,由操作系统在系统启动的时候就安排好了。

2、异常:

当CPU执行过程中发现一些异常情况,比如执行除法指令的除数是0,访问的内存地址无效,或者访问的内存地址属于特权页面等这些情况,CPU都会触发异常。

异常和中断的流程有一些类似,遇到异常时,CPU也会将执行的上下文保存在栈中,转入内核执行中断处理程序。

通过异常进入内核的入口和中断一样,也是记录在IDT中的,同样是操作系统在系统启动的时候就安排好了。

3、系统调用:

在系统编程中,我们经常会调用很多操作系统提供的API函数,比如文件操作、内存操作、网络操作等等,这些函数都是操作系统封装出来的应用程序编程API,只是一个接口,真正的底层实现是位于内核中的系统调用函数。

应用层上的API通过CPU专门的指令(如sysenter/syscall)进入内核来完成对应的功能,进入内核后的入口同样也是操作系统提前安排好了的。

总结

最后,让我们回答最开始知乎的那个问题:进入内核态究竟是什么意思?

CPU为了进行权限管控,引入了特权级的概念,CPU工作在不同的特权级下能够执行的指令和能够访问的内存区域是不一样的。

计算机在启动之初,CPU运行在高特权级下,操作系统率先获得了执行权限,在内存中圈了一块地,将自己的程序代码放了进去,并设定了这一部分内存只有高特权级才能访问。

随后,操作系统在创建进程的时候,都会把自己所在的这块内存区域映射到每一个进程地址空间中,这样所有进程都能看到自己的进程空间中,有一块叫“内核”的区域,这一块区域是无法擅入的。

所谓的“进入内核态”是指:当中断、异常、系统调用等情况发生的时候,CPU切换工作模式到高特权级模式Ring0,并转而执行位于内核地址空间处的代码。

看完这篇,你明白进入内核态是怎么一回事了吗?

看不懂没关系,下面用一张图来总结一下:

怎么样,这下懂了吧?

往期推荐

做安全操作系统,这位技术老兵很认真

《新程序员002》图书正式上市!

一部手机是否能用7年?你用了几年?

张一鸣购得元宇宙入场券,谁将是头号玩家?

点分享

点收藏

点点赞

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我在阿里云做云开发平台

简介: 你体验过云上的研发模式了没? 各大云厂商今年在开发者阵地侧逐渐开始向“云”化开发发展,最为显著的产品就是Cloud IDE,催生出来的趋势就是云端开发。云开发现阶段尽管在各大公司内部无法作为日常开发工具普遍推广&#xff…

mysql 事务日志备份_事务日志备份与恢复 5

14.5 用Bak文件恢复到故障点的奥秘如果数据库被损坏,我们就只能利用备份集文件(通常扩展名为BAK)来恢复数据库,如果备份集中包含了尾日志备份,我们同样能将数据库恢复到故障点。前面我们已经介绍了使用restore headeronly命令可以查看备份集文…

从no-code到low-code:企业级hpaPaaS的未来

简介: 本文将简单谈一谈基于 no-code > low-code > pro-code 渐进式思路的研发体系。 引子 宜搭负责人骁勇给我举过一个例子,我们小时候逢年过节穿的衣服,都是去裁缝店选一下材料、量一下尺寸,等个半个来月,讨回…

“解救”外卖骑手,美团首次公开算法规则!

整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)相信大家点外卖的时候都会注意到“预估到达时间”这一栏,那你是否好奇过这个时间是怎么得出来的呢?简单用距离除以速度?还是结合送餐距离、出餐时间和天气情况等更多…

Serverless 极致弹性解构在线游戏行业痛点

简介: 本文将通过剖析一个个具体的场景案例,以期望给相关的游戏开发同学带来共鸣,同时也希望能给非游戏行业的同学带来一些启发。 一、前言 1. 游戏客户上云关注点 游戏行业是一个富有创意又竞争激烈的市场,被称为第九艺术。游戏…

ACK正式支持对基于Alibaba Cloud Linux操作系统的集群进行等保加固

简介: 我们对基于Alibaba Cloud linux操作系统的ACK集群进行等保加固,意味着阿里云在云产品开发和交付的过程中将安全作为重要组成部分,将合规融入到产品的“血液”中,把安全植入产品的“骨髓”里,能够帮助有等保诉求的…

华为一口气发布十余款新品,HarmonyOS用户过亿

9月13日19:30,华为在线上举办了智慧办公新品发布会。本次发布会带来了华为MateBook 13s笔记本电脑、华为MateBook 14s笔记本电脑、华为MateStation X一体机、华为PixLab X1打印机、华为MateView GT 27英寸曲面屏显示器以及华为MatePad Pro 12.6英寸套装版等十余款新…

labelme实例分割_MaskRCNN在多个实例数据集上实践

刚刚开通付费功能,好奇心驱使我试试效果,这不,前两天试了一下,感觉也没啥新奇的。我的公众号使命是记录和分享个人学习经历,不会使用付费功能的。在此也非常感谢之前给我付费的小伙伴哈,哈哈,话…

技术干货 | 阿里云数据库PostgreSQL 13大版本揭秘

简介: 阿里云RDS PostgreSQL是一款兼容开源PostgreSQL的全托管云数据库产品,自2015年首次发布以来,根据用户需求不断升级迭代,已支持9.4、10、11、12等多个版本,覆盖了高可用版、基础版、只读实例等多种形态&#xff0…

国家能源集团携手华为首次部署矿鸿操作系统,开创工控新纪元

9月14日,由国家能源集团携手华为公司共同举办的“矿鸿操作系统”发布会在北京圆满举行。矿监局、工信部、科技部、能源局、煤炭工业协会、国家能源集团、华为等政府机构与企业代表出席,共同见证了“矿鸿操作系统”的正式发布。面对煤矿数字化、智能化的快…

MaxCompute在电商场景中如何进行漏斗模型分析

简介: 本文以某电商案例为例,通过案例为您介绍如何使用离线计算并制作漏斗图。 背景 漏斗模型其实是通过产品各项数据的转化率来判断产品运营情况的工具。转化漏斗则是通过各阶段数据的转化,来判断产品在哪一个环节出了问题,然后…

ado.net mysql 事务_ADO.NET事务

在发布System.Transaction命名空间之前,可以直接用ADO.NET创建事务,也可以通过组件、特性和COM运行库(位于System.EnterpriseServices命名空间中)进行事务处理。本文如题所示,介绍在这些传统事务处理方式中较为简单的“ASP.NET事务”。在传统…

这可能是大型复杂项目下数据流的最佳实践

简介: 实际项目中沉淀的数据流最佳实践。 数据流是前端一直以来都存在的一个问题,我们项目沉淀了一套最佳实践,如有问题,欢迎探讨 在旧的 Done 项目中,代码复杂度高,已经到了“牵一发而动全身”&#xff0c…

淘宝推荐、视频搜索背后的检索技术竟是它!深度揭秘达摩院向量检索引擎Proxima

简介: 淘宝搜索推荐、视频搜索的背后使用了什么样的检索技术?非结构化数据检索,向量检索,以及多模态检索,它们到底解决了什么问题?今天由阿里巴巴达摩院的科学家从业务问题出发,抽丝剥茧&#x…

ipython和jupyter哪个好_对Python开发者而言,IPython仍然是Jupyter Notebook的核心

如果你不明白 Jupyter 是什么,这么说吧,它拥有和 IPython 同样的代码,并且是由同一批人开发的,只不过取了一个新名字、安了一个新家。下面这个注脚进一步说明了这一点:我从声明中解读出来的信息是,“Jupyte…

这个高薪行业正在大量招人,你会考虑吗?

作者 | 侯淼淼 出品 | 《新程序员》当人们提及“程序员”这一职业的时候,大多数人的第一想法往往是高薪。然而近年来,随着造车势力的兴起,新一轮的高薪岗位抢人大战正式打响。2021年以来,一汽、东风等传统车厂招聘岗位数量持…

AI在出行场景的应用实践:路线规划、ETA、动态事件挖掘…

简介: 本文是#春招专栏#系列的第1篇,根据高德机器学习研发部负责人damon在AT技术讲坛所分享的《AI在出行领域的应用实践》的内容整理而成。 前言:又到春招季!作为国民级出行服务平台,高德业务快速发展,大量…

lsof查看进程占用文件_Linux 利用lsof命令查找已经删除的文件来释放磁盘空间

测试环境一台服务器/ 根目录空间使用率达到94%,但是通过du -sh * 发现实际空间没没用用到那么多,初步怀疑,之前删除的文件,有运行中的进程一直占用,导致空间没有释放,如图通过du -sh * 发现共实际使用不到1…

AcWing 1238. 日志统计(双指针,滑动窗口)

题目&#xff1a; 1238. 日志统计 - AcWing题库 数据范围 输入样例&#xff1a; 7 10 2 0 1 0 10 10 10 10 1 9 1 100 3 100 3输出样例&#xff1a; 1 3 思路&#xff1a;双指针 代码&#xff1a; #include<iostream> #include<cstdio> #include<cmath>…

基于 Wasm 和 ORAS 简化扩展服务网格功能

简介&#xff1a; 本文将介绍如何使用 ORAS 客户端将具有允许的媒体类型的 Wasm 模块推送到 ACR 注册库&#xff08;一个 OCI 兼容的注册库&#xff09;中&#xff0c;然后通过 ASM 控制器将 Wasm Filter 部署到指定工作负载对应的 Pod 中。Wasm Filter 部署中的所有步骤都使用…