【操作系统】第二章:OS的启动和中断、异常、系统调用(二)

简介: 【操作系统】第二章:OS的启动和中断、异常、系统调用

正文


异常(Exception)的处理过程


6da34ff9d57c13a90b7b2fe2188e32df_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

异常与中断不同,异常也是因为某个特定的指令触发了异常事件,比如除0操作。他也会有一个异常的ID,然后OS会根据这个ID保存现场(当前执行进度、这条指令地址、当前寄存器的内容等)。保存之后操作系统会根据ID进行相应处理,分为两种:


退出执行(杀死)或者重新执行[OS认为这个程序的异常原因是因为OS的服务不到位,OS会进行一定的弥补工作,然后根据刚才异常产生的现场进行恢复,让应用程序重新执行。由于OS已经将把他产生异常的原因补完,所以就不会再次产生异常,这个过程和中断相同,对应用程序是透明的。APP感受不到某条特殊指令会产生异常。


系统调用System Call


daf91a9648017e9802c473a843faa17b_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

来源于APP,需要OS提供服务,而这些服务APP不能直接执行,需要OS来执行。这些过程需要一些接口,这些接口我们称为系统调用接口。有这些接口,OS就能给我们提供各种服务。

Ex)

……………………
printf("Helloworld!");
……………………


这条指令是打印一串字符串。这条指令最终会触发一个write()系统指令。write系统调用会带一些参数,这些参数包含了要让哪个设备来显示这个字符串以及字符串的内容。很明显操作系统在获取这个参数后会访问对应的设备,比如这里就是我们的屏幕。着整个过程是操作系统完成的而不是应用程序完成的,应用程序只能发出请求。当OS完成这个请求,它会返回一个成功或者失败让APP知道,然后APP进行后续的执行工作。

上图中的右子图是一个通用接口,通过这个借口,APP可以完成各种各样的功能,对整个计算机系统进行间接的管理和控制。

为了方便应用程序能够使用OS的系统调用接口,产生了很多定义好的API。

详见下图

8418d802c90e45b7250001865d3838b5_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

POSIX:通用可移植的标准。遵循这个标准的OS,同一个程序可以跨平台执行。

JAVA API:不是系统调用,那些API只是Java虚拟机提供的支持,是由库来实现的。最终还是根据环境不同(WIN/LINUX环境)应用其他API来实现OS功能。


系统调用的实现


对于应用程序(APP),它只需要知道这个系统调用能提供什么样的功能,他的接口是什么,参数是怎么定义的就可以了。但是从操作系统的角度来说。

英文原图:

0facee361c7c0b550051c420c788e342_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

f87313f2411795772c23a35fc8bb1a05_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

APP会直接或者间接通过库(Library)来访问系统调用的接口,一旦访问API。会触发一个从用户态到内核态的转变。


用户态:应用程序 执行过程中,CPU处于一个特权级的状态。他的特权级非常低,不能够直接访问某些特殊的机器指令和直接访问IO。

内核态:OS运行过程中CPU所处于的一个状态,这个状态下OS可以执行任何一种指令,这使得安全性得到保障。


System Call Interface阶段:当我们应用程序调用一个系统调用时,完成一个用户态到内核态的装换,控制权从APP转到OS。

那么OS可以对应用程序发出的这些系统调用的参数(ID)做出标识,作出标识后,就可以对这个系统调用进行识别和完成具体的服务。


函数调用和系统调用的区别


当应用程序发出函数调用,其实是在一个栈空间完成的参数的传递和返回。

但是系统调用的执行过程中,我们的应用程序和操作系统拥有各自的堆栈,当APP发出系统调用之后,当他切换到内核里执行的时候,需要切换堆栈同时也需要完成特权级的转换 (用户态到内核态)。这些转换都会需要一定的开销,也就意味着当系统调用时,开销会比函数调用大很多。


开销


f87313f2411795772c23a35fc8bb1a05_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

由图可知,三种操作都跨越了APP和OS和外设的边界,跨越边界都有一定的代价。跨越边界是为了更加安全、可靠地执行各种上级程序。

5b4c0e74fb9df2be656391157ed2e4d0_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png映射关系的开销

表:

指令 对应服务历程
中断号x y1
异常号x y2
系统调用号x y3

为了让中断/异常/系统调用进行处理,首先要有一个对应的映射关系。(对应的系统调用号、中断号对应的哪一个服务历程,这个表要在能够让他正常工作之前就建好。OS初始环节就需要把这个表做好)


内核堆栈的开销

操作系统有自己的堆栈,不能和程序堆栈混淆。这样维护堆栈的开销也是必须的。(退出时保存堆栈,执行时堆栈恢复等)。同理,APP的执行到内核里执行时,需要保存APP的堆栈信息,当内核操作完成后,返回到APP又需要用到APP的堆栈信息。

验证参数的开销

操作系统不信任我们的应用程序,他会认为APP会有恶意程序的存在。所以OS在运行APP之前会进行一个安全检查,这个检查当然也会有开销。


内核态映射到用户态的开销

操作系统处理完某些数据后,会把这些数据从内核态拷贝到用户态,这个过程会有新的开销。不像应用程序内指针传递那样简单,他必须要把内核空间的数据拷贝到用户空间。


内核态的独立地址空间的开销

随着应用程序执行,有可能会引起内存状态的改变(后续课程详解)。比如页机制的转变,关于CPU的Cache(闪存)和TLB有可能会被刷新。这个刷新过程会导致额外的开销。


关于Cache和TLB相关内容请参考CSA(计算机组成原理对应章节)

小结:

这些都因为执行中断、异常、系统调用过程中可能会带来的开销,但是这些开销是必须的,有这些开销的存在才能保证OS在安全可靠的环境下运行。



目录
相关文章
|
6天前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
50 10
|
10天前
|
运维 前端开发 应用服务中间件
操作系统智能助手OS Copilot新功能
作为一名公司的研发人员,我体验了OS Copilot的安装与使用。尽管我的工作主要涉及前后端开发,对云服务有一定了解。OS Copilot的安装过程直观顺利,但目前支持的操作系统较少。通过-t和-f功能,可以快速测试命令输出、处理批量任务及调试脚本,显著提升了工作效率。然而,管道功能在实际应用中存在识别文件路径的问题,有待改进。总体而言,OS Copilot极大地提高了我的运维效率,并成为开发中的有效工具,我对它的未来潜力充满信心。
36 11
|
10天前
|
移动开发 运维 前端开发
操作系统智能助手OS Copilot新功能
我是一名公司前端开发人员,专注于官网和H5页面的开发,涵盖页面构建、交互逻辑及性能优化。主要负责静态和移动端页面开发,不直接涉及云资源运维,但在项目部署时会接触云服务器。 关于Copilot的使用体验:安装过程顺畅,目前功能较少,建议增加更多功能和中文支持。核心功能包括-t代理模式(实现黑客帝国代码瀑布效果但未达预期)、-f读取文件(生成随机字符接近目标但仍需改进)和管道功能(稳定性欠佳)。总体而言,-t/-f选项实用,管道功能需完善。
|
11天前
|
Shell 测试技术 UED
云产品评测|操作系统智能助手OS Copilot新功能
作为一名企业开发人员,我最近测试了 OS Copilot 的 -t、-f 功能及管道功能。-t 功能能正确识别并解释端口号,但界面操作需优化;-f 功能成功完成自定义任务,但在交互连续性上有待改进;管道功能表现最佳,支持简便的自定义任务操作。建议在 -t 功能中增加交互入口,并优化 -f 功能的后续操作体验。
|
11天前
|
自然语言处理 运维 Linux
阿里云操作系统智能助手OS Copilot测评报告及建议
阿里云推出的OS Copilot是一款基于大模型构建的操作系统智能助手,旨在通过自然语言处理技术与操作系统经验的深度融合,为Linux用户提供前所未有的使用体验。它具备自然语言问答、辅助命令执行和系统运维调优等核心功能,极大降低了Linux的学习门槛,提升了工作效率。测试显示,OS Copilot在功能、性能、易用性和实用性方面表现出色,能够帮助用户高效解决问题并优化系统性能。未来,期待其持续优化升级,加入更多实用功能,进一步提升用户体验。
55 4
|
24天前
|
弹性计算 运维 自然语言处理
|
26天前
|
人工智能 运维 应用服务中间件
云产品评测|操作系统智能助手OS Copilot新功能
作为一名全栈开发,我在日常维护阿里云服务器时,由于对Linux不熟悉,常常感到运维困难。最近尝试了阿里云推出的OS Copilot,发现它极大简化了操作。通过简单的命令如`co nginx是否安装`和`co 将nginx设置为开启自启动 -t`,可以轻松完成复杂的任务。使用`-f`参数还能处理复杂任务,例如从Nginx日志中提取最常访问的IP地址。此外,Copilot还支持管道解析,帮助解读文件内容。总体而言,OS Copilot显著提升了我的工作效率和信心,建议进一步增加功能和优化体验。
|
1月前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
75 7
|
1月前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
67 6
|
1月前
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享

推荐镜像

更多