操作系统总结(第二周 第一堂)

前言:

第一周的重点就在于一张图表:

基于这张图,我们将陷入内核分为了两个大块Trap和Interrupt。同时我们知道一件事情任何一次I/O操作或者错误程序操作都将陷入内核,从而使得内核可以监控所有的外部设备以及维护整个电脑程序运行的安全。

此时就要提出一个问题:

如果每次I/O请求都需要陷入操作系统,或者每次运行n/0时都会报错从而陷入操作系统 。那么我们可不可以自己去通过汇编语言写一个I/O操作或者div操作使得这些操作不会陷入内核,从而提高程序运行的效率。

答案自然是:不可以的

操作系统的保护

保护原因

对于上面那个问题——跨过内核直接进行I/O操作,或者进行非法操作,这会导致操作系统崩溃。

正常流程:

此时如果一开始跨过内核,直接调用I/O接口,那么在最后cpu调用操作系统时,操作系统进程记录中并没有一开始调用I/O接口的进程记录,此时操作系统就会崩溃(操作系统需要对每一个操作完成进程的管理

保护方式

为了防止上面的情况出现设计了一种特殊结构包括:

指令集的双类型、硬件系统的双模式

这一结构的要点在于:

一、硬件系统双模式有:内核模式、用户模式

二、指令集的双类型有:特征指令、非特征指令

三、特征指令:可能对操作系统或计算机本身造成损害的机器指令

四、内核模式:操作系统开始运行后,包括cpu在内的计算机硬件状态

五、内核模式下才能运行特征指令,用户模式下只能运行非特征指令

 保护逻辑

进一步来思考为什么这个结构可以实现保护:

保护原因里面提到的出现崩溃的原因就是:有一些指令他跨过了操作系统被用户直接调用,而这些指令对整个计算机系统的运行是有潜在损害的。

所以解决问题的关键就是让用户不能使用这些指令,让这些指令只能被操作系统使用

此时

将这些指令设置为特征指令,再让硬件系统只有在陷入内核时才转为内核模式,平时硬件系统为用户模式

那么

如果用户不陷入内核,硬件系统会保持用户模式,此时调用I/O指令(属于特征指令),硬件系统会认为这是一种错误的指令调用,于是认为是interrupt重新陷入内核,然后内核会将进程杀死。从而起到保护的作用 

注意:1、陷入内核是非特征指令,回到用户模式是特征指令 

           2、在kernal mode下运行的软件总体叫作kernal

           3、进入kernal mode的方式只有三种中断

操作系统保护的验证(开源编程工具集、GDB调试工具集)

课上老师利用C语言内嵌汇编语言来给我们展示如果直接调用特征指令的后果。

具体操作如下:

这里老师使用的是开源的编程工具集,常用于编译和链接各种编程语言的源代码:

gcc -g :编译C语言文件(包含调试信息,源代码放到目标文件当中)

gcc -o :生成C语言文件的目标文件,文件名为staticcli

gcc -S :将C语言文件变为汇编文件

由于GDB是为unix系统开发的,在window系统上不能直接使用,所以老师这里远程连接了一台linux的虚拟机。linux、MaxOs都是基于unix开发的,所以可以调用GDB。

通过上面的linux操作语句得到包含调试信息的目标文件staticcli,这里再调用gdb -x staticcli对包含调试信息的目标文件进行深入调试。

start语句表示开始gdb模式,info all-registers语句表示查看寄存器中的信息(如下图),寄存器中存放的就是一条条机器语句。通过这个我们可以找到main所在的寄存器位置,然后利用jump指令跳转到main的寄存器。因为编译器为了和操作系统等联系,会在我们的代码外面自动加上一层。

由于staticcli是目标文件,目标文件是由机器代码组成的,而机器代码是汇编语言组成的,所以下面调用x/i语句就可以一一查看文件汇编代码的一条条语句。

nexti语句就是一步步去运行汇编代码。运行结果如下:

一步步查看并运行汇编代码到达asm(“cli”), 由于该指令是一条关中断指令(特征指令)而我们并不是调用接口通过操作系统去运行,而是自己写汇编去运行。所以会被操作系统强行中断进程,报出segmentation fault(段错误)

总结

本文到这里就结束啦~~这堂课设计的内容较为杂乱、复杂,但是学一学拓展一下知识是非常好的呀~~
如果觉得对你有帮助,辛苦友友点个赞哦~理解+总结+编辑花了4h左右呢

知识来源:操作系统概念(黑宝书)、山东大学高晓程老师PPT及课上讲解。不要私下外传

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

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

相关文章

柜面服务能力演讲及岗位技能大赛活动方案

为提升柜面服务能力及员工专业能力,助力业务发展,聚力推进“柜面焕新升级”活动,进一步为销售一线提供及时、高效、顺畅、快捷的服务支持,省公司将组织开展“凝聚你我力量,共助业务发展”演讲及岗位技能大赛活动&#…

C语言——动态内存分配

前言:通过前面的学习,我们知道C语言中在内存中开辟空间的方法有:变量和数组。既然拥有了开辟空间的方法,我们为什么还要学习动态内存分配呢? int val 20; //在内存中开辟四个字节的空间 int arr[10] { 0 }; //在内…

如何在Linux部署DataEase数据分析服务并实现无公网IP远程分析内网数据信息

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务…

mysql数据库:使用 bash脚本 + 定时任务 自动备份数据

mysql数据库:使用 bash脚本 定时任务 自动备份数据 1、前言2、为什么需要自动化备份?3、编写备份脚本4、备份脚本授权5、添加定时任务6、重启 crond / 检查 crond 服务状态7、备份文件检查 💖The Begin💖点点关注,收藏…

【代码随想录】【二叉树】补day21:二叉搜索树的最小绝对差 、二叉搜索树中的众数 、二叉树的最近公共祖先

最小绝对差 1.申请一个数组,比较两两之间最小的差值 def getresult3(self,node:TreeNode):self.nums[]self.getMinimumDifference(node)mindifferencefloat(inf)for i in range(len(self.nums)-1):mindself.nums[i1]-self.nums[i]if mindifference>mind:mindiff…

U盘打不开怎么办?专家解析原因与数据恢复之道

一、遭遇困境:U盘突然无法访问 在日常生活和工作中,U盘作为重要的数据存储和传输工具,其稳定性和可靠性至关重要。然而,有时我们会突然遭遇U盘打不开的困境,这无疑令人感到焦虑和困惑。当我们将U盘插入电脑时&#xf…

U盘文件夹变exe,数据恢复与防范全攻略

在日常使用U盘的过程中,不少用户都遭遇过这样一个令人头疼的问题:原本整齐有序的文件夹突然变成了exe可执行文件。这种异常情况不仅影响了文件的正常访问,更可能隐藏着数据丢失的风险。本文将深入探讨U盘文件夹变exe现象的背后原因&#xff0…

OSCP靶场--BlackGate

OSCP靶场–BlackGate 考点(1.redis rce 2. CVE-2021-4034提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.163.176 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-14 03:32 EDT Nmap scan report for 192.168.163.…

《LeetCode热题100》笔记题解思路技巧优化_Part_3

《LeetCode热题100》笔记&题解&思路&技巧&优化_Part_3 😍😍😍 相知🙌🙌🙌 相识😢😢😢 开始刷题链表🟢1. 相交链表🟢2. 反转链表&…

Python常见设计模式库之python-patterns使用详解

概要 设计模式是解决软件设计问题的经验总结和最佳实践。Python 作为一种灵活且强大的编程语言,也可以使用设计模式来提高代码的可读性、可维护性和可扩展性。Python Patterns 库提供了一系列经典和常用的设计模式实现,本文将深入探讨 Python Patterns 库的功能、使用方法以…

java-app后台系统崩溃后的处理

系统架构: 系统用的是ngixn 、spirngcloud、nacos作为注册中心、gateway网管,数据库是mysql 数据库只有一个 服务也是单实例的 所以没有办法做负载均衡什么的。 问题描述: 公司近期开了几个活动之后由于访次数较多和代码问题导致系统挂了。…

Git如何清除账户凭证

场景:一般发生在Git用户变更的情况 1.git base 操作 Git会使用凭证助手 credential.helper来储存账户凭证,通过以下命令移除: git config --system --unset credential.helper 除了system系统级外,还有 global、local范围。 查…