问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

“从零到一:揭秘操作系统的奇妙世界”【操作系统系统调用、体系结构】

创作时间:
作者:
@小白创作中心

“从零到一:揭秘操作系统的奇妙世界”【操作系统系统调用、体系结构】

引用
CSDN
1.
https://m.blog.csdn.net/m0_60024689/article/details/144499313

操作系统是计算机系统的核心,它负责管理硬件资源,提供各种服务,使得应用程序能够顺利运行。本文将从系统调用、操作系统体系结构、引导过程和虚拟机等方面,深入探讨操作系统的奇妙世界。

一、系统调用

【1】定义

计算机给用户提供的接口是命令接口,给程序员提供的接口是程序接口。程序接口是用户程序取得OS服务的唯一途径。而程序接口就是由一系列系统调用组成的。所以可以说系统调用是OS提供给程序员使用的接口。

课本:
系统调用在本质上是应用程序请求OS内核完成某种功能的一种过程调用。但它是一特殊的过程调用。一般的过程调用,其调用程序与被调用程序运行在相同的状态——内核态或用户态。系统调用与一般的过程调用最大的区别就是系统调用的调用程序运行在用户态,而被调用程序运行在内核态。

  • 系统调用可以嵌套使用。
  • 系统调用是通过中断机制实现的,并且一个OS的所有系统调用都通过一个中断入口来实现
  • 参数通常通过寄存器传递给操作系统。

【2】分类

2.1进程控制类系统调用

  • 创建和终止进程的系统调用
  • 获得和设置进程属性的系统调用
  • 等待某事件出现的系统调用

2.2文件操纵类系统调用

  • 创建和删除文件的系统调用
  • 打开和关闭文件的系统调用
  • 读和写文件的系统调用

2.3进程通信类系统调用

  • 采用信息传递方式
    当采用信息传递方式时,源进程先发出一条打开连接的系统调用,其次目标进程应利用接受连接的系统调用表示同意之后就可以开始通信。
  • 采用共享存储区方式
    当采用共享存储区方式时,先利用建立共享区存储的系统调用建立一个共享存储区,再利用建立连接的系统调用将共享存储区连接到进程自身的虚地址空间上。然后便可利用读和写共享存储区的系统调用实现相互通信。

【3】系统调用VS库函数

  • 执行环境:
    系统调用在内核空间执行,这意味着它们需要从用户态切换到内核态。
    库函数在用户空间执行,不需要切换到内核态。

  • 实现:
    系统调用由操作系统实现。
    库函数可以由第三方或开发者实现。

  • 权限:
    系统调用通常需要较高的权限,因为它们涉及到操作系统的资源管理和硬件操作。
    库函数通常不需要特殊权限,因为它们在用户程序的权限范围内执行。

系统调用是一个比库函数更底层的接口,裸机之上是操作系统,操作系统的接口就是系统调用。使上层的应用可以通过系统调用请求操作系统内核的服务。再往上就是高级语言,各种编译语言会通过库函数来封装函数调用,但并非所有的库函数都会在底层使用系统调用。

【4】必要性

  • 对共享资源的互斥访问,需要用到系统调用
    问题:两个人都要使用打印机进行打印操作,打印不同论文
    解决思路:实现各个进程对资源进行互斥共享
    解决办法:由操作系统内核对共享资源进行统一的管理,并向上提供“系统调用”,用户进程想要使用打印机这种共享资源,只能通过系统调用对操作系统内核发出请求,内核会对每个请求进行协调。

【5】功能

  1. 设备管理 完成设备请求/启动/释放等功能
  2. 文件管理 完成设备读/写/删除等功能
  3. 进程控制 完成进程创建/撤销/阻塞/唤醒等功能
  4. 进程通信 完成进程之间消息传递/信号传递等功能
  5. 内存管理 完成内存分配/回收等功能

应用程序通过系统调用请求操作系统的服务,而系统中的各种共享资源都由操作系统统一掌管,因此凡是与共享资源(存储设备/io操作/文件管理)有关的操作,都必须通过系统调用的方法向操作系统提出请求,由操作系统内核代为完成,这样可以保证系统的稳定性与安全性。

【6】如何进行系统调用?

详细:
应用程序运行在用户态,他的指令会被cpu依次执行,如果想要进行系统调用,会先进行传参指令,把必要的参数传入,这种传参指令中包含一些参数,一般是表明这个进程需要向操作系统申请什么类型的服务,服务时长是多少之类的。然后执行陷入指令,将用户态切换为内核态,进入内中断状态,cpu控制权重新回到操作系统手中,然后cpu检测到中断信号之后,会找到合适的中断信号程序对该中断信号进行处理,此时的中断信号程序就是系统调度的入口程序。接下来这个系统调用的入口程序就会根据你传入的参数判断用户需要的系统调用服务。系统调用被处理完之后,就会接着运行刚刚的应用程序。

简洁:
前期处理相关指令---执行传参指令,传递系统调用参数---执行陷入指令(在用户态执行)---检查寄存器参数(从而得知用户需要哪种服务)----找到相应的系统调用服务程序并执行---返回应用程序

注意!!!

1.陷入指令=trap指令=访管指令
2.陷入指令是在用户态执行的。执行陷入指令后立即引发一个内中断,使cpu进入一个核心态
它是一个特殊的指令,但并不是一条特权指令。
3.系统调用的调用程序运行在用户态,被调用程序运行在内核态。
4.系统调用是通过中断机制实现的,并且一个OS的所有系统调用都通过同一个中断入口来实现。

二、体系结构

操作系统最核心的部分需要放到内核之中。比如说时钟管理/中断处理/原语。

  1. 时钟管理:利用时钟中断实现计时功能。
  2. 中断处理:负责实现中断机制。
  3. 原语:原语是一种特殊的程序,具有原子性。也就是说,这段程序的运行必须一气呵成,不可被“中断” 。处于操作系统最底层,是最接近硬件的部分。

【1】简单结构

1.1 特性:
操作系统作为一个整体运行,没有明确的模块或层级划分。

1.2 缺点:
编写程序错误多,调试困难。
程序难以阅读和理解,维护困难。
由于代码过于杂乱复杂,所以采取模块化结构,让代码结构更加清晰。

【2】模块化结构

2.1 特性:

  • 使用模块-接口法,将内核划分为多个模块,各模块之间相互协作。
  • 内核=主模块+可加载内核模块。主模块:只负责核心功能,如进程调度、内存管理。可加载内核模块:可以动态加载新模块到内核,而无需重新编译整个内核。
  • 划分模块时,需注意独立性问题。衡量模块独立性有两个标准。一个是内聚性,指模块各部分联系的紧密程度。内聚性越高,独立性越强。另一个是耦合度,耦合度越低,独立性越强。

2.2 优点:

  • 模块间逻辑清晰易于维护,确定模块间接口后即可多模块同时开发。
  • 支持动态加载新的内核模块,增强OS的适应性。
  • 任何模块都可以直接调用其他模块,无需采用消息传递进行通信,效率高。
  • 提高了OS的正确性、可理解性和易维护性。

2.3 缺点:

  • 模块间的接口定义未必合理实用。
  • 模块间相互依赖,更难调试和验证。

由于无法做到设计中的每一步决定都是建立在可靠的基础上,所以就设计出来分层式结构。

【3】分层式结构

3.1 特性:

  • 使用自底向上分层设计法
  • 最底层是硬件,最高层是用户接口。每一层只能用相邻低一层所提供的功能和服务。

3.2 优点:

  • 便于调试和验证,自底向上逐层调试验证。
  • 易扩充和易维护,各层之间调用接口清晰固定。
  • 自下而上的设计方式,比较容易保证整个系统的正确性。

3.3 缺点:

  • 仅可调用相邻低层,难以合理定义各层边界。
  • 效率低,不可跨层调用,系统调用执行时间长。
    大内核:两次cpu状态的转换
    微内核:六次cpu状态的转换
    cpu状态的频繁转换,会使系统性能降低

【4】宏内核结构(大内核)

4.1 特性:

  • 将操作系统的主要功能模块都作为系统内核,运行在核心态。(大内核结构的OS通常也采用了“模块化”的设计思想)。

4.2 优点:

  • 性能高,内核内部各种功能可以直接相互调用。

4.3 缺点:

  • 内核庞大功能复杂,难以维护。
  • 某个功能模块出错,就可能导致整个系统崩溃。

【5】微内核结构

5.1 特性:

内核中只保留与硬件关系最紧密的那部分就叫做微内核。只把中断、原语、进程通信等最核心的功能放入内核,进程管理、文件管理、设备管理等功能以用户进程的形式运行在用户态。

  • 采用客户/服务器模式,将OS划分为两个部分:微内核和多个服务器
  • 客户与服务器之间采用的是消息传递机制
  • 采用策略与分离原则
  • 采用面向对象技术

这里我想补充一下,机制就是我们说的具体实现,比如说两根胡萝卜如何吃。一般放在微内核中
策略就是算法,实现思想,比如说两根胡萝卜怎么分、一般放在服务器中。

5.2 优点:

  • 内核小功能少,易于维护,内核可靠性高。
  • 某个功能模块出错不会导致整个系统崩溃。
  • 系统可拓展性高,不仅方便添加新功能,还可以修改过时功能。
  • 融入了面向对象技术,可移植性高。

5.3 缺点

  • 性能低,需要频繁的在用户态和核心态之间切换。用户态下的各功能模块不可以直接相互调用,只能通过内核的“消息传递”来间接通信。
  • 用户态下的各功能模块不可以直接相互调用,只能通过内核的“消息传递”来间接通信。

【6】外核结构

6.1 特性:

  • 内核负责进程调度、进程通信等功能,外核负责为用户进程分配未经抽象的硬件资源,且由外核负责保证资源使用安全。

6.2 优点:

  • 外核可直接给用户进程分配:“不虚拟、不抽象”的硬件资源,使用户进程可以更灵活的使用硬件资源。
  • 减少了虚拟硬件资源的“映射层”,提升效率。

6.3 缺点:

  • 降低了系统的一致性
  • 使系统变得更复杂

什么是未经抽象的硬件资源呢?
抽象的硬件资源就是说用户觉得这是系统为进程分配了一片连续的物理空间,但实际上经过页表置换之后并不是连续的而是离散的。
未经抽象的意思就是说直接在外存申请一片连续的物理地址空间,并且需要外核保证在该进程占有该空间时,别的进程无权访问。要保证进程的独立性与安全性。

补充知识点:

  1. 内核是操作系统最核心、最基本的部分。
  2. 实现操作系统内核功能的程序就是内核程序。
  3. 操作系统内核运行在内核态,非内核功能运行在用户态。
  4. 目前,设计OS的常用方法是采用可加载的内核模块。就是说无论在启动还是在运行时,内核可以动态加载新模块,就不需要每次添加新模块进来都要重新编译。

三、操作系统的引导

【1】什么是操作系统的引导?

在开机的时候让操作系统运行起来。

【2】磁盘中有什么数据?

预备知识点1:
在电脑装入磁盘后,电脑存储结构如图所示:

我们可以看到在开头的主引导记录(MBR),由磁盘引导程序和分区表组成。
在分区表中存储了各个盘的数据,比如说存储位置,硬盘大小。
预备知识2:
咱们都知道操作系统一般默认装在C盘
咱们再把C盘细分来看:
这个引导记录里面有一个启动管理器,这个启动管理器就是进行初始化工作的工具。
预备知识3:
计算机主存由ROM和RAM组成。
RAM中的数据一断电就会被清空,但是ROM中的数据不会。
计算机主存结构:

【3】在开机时,操作系统是如何进行初始化的?

首先第一步,刚刚我提到过切断电源的时候,ROM的数据不会被清空,所以说计算机启动的时候首先会访问内存中的ROM空间,而ROM中有一个引导程序,会指示CPU把磁盘引导记录读入内存。
其次,这个磁盘引导记录会根据分区表判断C盘的位置,找到C盘之后,会读入C盘的第一部分的数据。因为刚刚不是说可以在分区表里知道各个盘的位置和大小吗?
接下来就是看细分的C盘内的结构图,我们刚刚讲到C盘的头部放了PBR引导记录,根据引导记录可以找到自启动管理器,从而进行一系列的初始化工作。完成初始化工作之后就可通过操作系统去操作应用程序。

四、虚拟机

【1】虚拟机的出现

传统的计算机在一个物理机器上只能运行一个操作系统。操作系统之上又可以运行很多用户进程。这看上去似乎是很合理的。但是随着科学技术的发展,会导致资源利用率不合理的问题。比如你有一个非常强大的物理机,并且性能比较好。但是这时候只能运行一个操作系统。两个进程在同一个操作系统之上会有一些安全隐患。一种解决方法是把其中一个应用迁移到另一个物理机上,这台物理机上有一个独立的操作系统。这样就能防止两个进程相互影响。我的硬件本来可以支持两个进程运行,绰绰有余,但是为了安全起见我又不得不将两个应用分别放在两个物理机上运行。安装一个操作系统会带来很多应用上的限制,因此就有人发明了虚拟机。
其实说到底,虚拟机的发明就是为了解决一台计算机上两个进程可以同时运行但又互不影响的一个解决办法。

【2】 虚拟机的运作

虚拟技术就是将一台物理机器虚拟化为多台虚拟机器。
每一个虚拟机器上都可以独立运行一个操作系统。
要把一台物理机器虚拟化为多台虚拟机器,就需要用到虚拟机管理程序。

【3】虚拟机的分类

虚拟机管理程序分为两类:
第一类虚拟机管理程序会直接运行在硬件之上。
第二类虚拟管理程序运行在宿主的操作系统上。
第一类虚拟机管理程序会直接运行在硬件之上。
虚拟机管理程序会将一台物理机器虚拟化为多台虚拟机器,每一台虚拟机器上可以安装各自的操作系统,在每个操作系统之上又可以运行各自的用户进程。
只有虚拟机管理程序是运行在内核态的。只有它可以使用特权最高的那些指令。上层的操作系统和用户程序是运行在用户态的。
第二类虚拟管理程序运行在宿主的操作系统上。
可以在虚拟管理程序上安装客户的操作系统,
如果虚拟管理程序需要给虚拟机分配硬件资源,只能请求宿主操作系统给它分配,先由宿主操作系统进行分配再有虚拟管理程序进程再分配。硬件资源的管理者依然是宿主操作系统,
一类和二类的区别
一类就是房主
二类是二手房东,租别人的房子再转租给下一个人。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号