操作系统 - 启动、中断、异常、系统调用【1】

计算机体系结构概述

计算机的结构可以简化为下图。图中内存分为ROM(只读存储器)和RAM(随机存储器)。系统初始化代码从ROM里面读取并开始执行。

在这里插入图片描述

BIOS(英文:Basic Input/Output System),即基本输入输出系统,亦称为ROM BIOS、System BIOS、PC BIOS,是在通电引导阶段运行硬件初始化,以及为操作系统提供运行时服务的固件。BIOS最早随着CP/M操作系统的推出在1975年出现。BIOS预安装在个人电脑的主板上,是个人电脑启动时加载的第一个软件。

现在,BIOS的作用是初始化和测试硬件组件,以及从大容量存储设备(如硬盘)加载引导程序,并由引导程序加载操作系统;当加载操作系统后,BIOS通过系统管理模式为操作系统提供硬件抽象。在DOS时代,BIOS为DOS操作系统提供键盘、显示及其他I/O设备的硬件抽象层。

许多BIOS程序都只能在特定电脑型号或特定主板型号上运行。早年,BIOS存储于ROM芯片上;现在的BIOS多存储于闪存芯片上,这方便了BIOS的更新。

BIOS - 维基百科

电脑加电的时候会去执行BIOS部分。
在这里插入图片描述

在这里插入图片描述
这里是以X86为例,BIOS启动后第一步就是从一个特定的地址(固定的内存地址 cs:ip)开始执行,然后完成一系列的工作。

约定加电的时候,CPU完成初始化之后从上图中地址开始执行代码。注意BIOS这部分大小是在1MB左右的,因为此时地址空间只有20位,所以220bit即1MB可以用。

在这里插入图片描述

BIOS部分需要提供的功能如上图所示,基本输入输出用于从磁盘上读取/写数据、从键盘上读输入、在显示器显示输出等。系统设置的例子有从哪个盘启动,或者是不是从网络启动。

最后根据配置加载程序和操作系统内容。具体过程是:

在这里插入图片描述

之所以不能从BIOS里面直接读取系统的内核映像,是因为要先确定了磁盘上的文件系统(市面上的文件系统有很多种)才可以读取。我们是直接预先约定好不需要知道文件系统的类型,就可以直接读取第一块数据,然后根据这些数据来识别磁盘上的文件系统,最后读取磁盘上的操作系统的内核映像并加载到内存。

最后提一下BIOS提供的功能和限制:

在这里插入图片描述

系统启动流程

在这里插入图片描述

要找主引导引导记录来去确定从哪个文件系统里面去读取加载程序,因为可能不只是有一个分区,不同分区使用的可能不是同一种文件系统。在确定主引导扇区之后就可以确定去哪个活动分区读取程序了。

在这里插入图片描述
在这里插入图片描述

自检是为了确定关键的几个硬件正常工作。系统检测主要是确定有没有系统存在,例如从U盘中启动系统(WinToGo)前就会先检测一下有没有系统在你的U盘里。最后会从指定的软盘、硬盘或者光驱读取第一块扇区。

读进来之后就要读取主引导记录:

在这里插入图片描述

读取完之后就会跳到活动分区的引导扇区上:

在这里插入图片描述

JMP部分与平台相关,不同平台不相同。启动代码来确定程序存放在哪,可以改动,程序的位置也可以改动。

在这里插入图片描述

启动配置文件的格式由系统决定。

在这里插入图片描述

BIOS已经有相应的标准,在写代码的时候需要按照标准来写(这样就不需要再每一种平台上都要实现不同的BIOS)。MBR是最早的,主引导记录只能最多描述4个分区,每个占16字节,总长512字节,但是现在计算机往往要用到4个以上的分区,所以就提出了GPT(全局唯一标识分区表),这样就可以不受只能描述4个分区的限制。PXE是网络启动的标准。UEFI还提供了对磁盘签名的认证,如果签名不对,那么会拒绝继续读取磁盘上的内容。

在这里插入图片描述

中断、异常和系统调用比较

为了给程序提供服务,同时不让程序执行特定的操作(安全问题)。关于图中的问题:外设连接计算机时,为了让系统能够对外设的输入做出适当的反应,就需要用到中断(用轮询的话太耗资源)。程序出错的时候也需要有相应的措施来应对这种意外情况。通过系统调用来提供接口,这样就可以在提供服务的前提下不至于导致出现安全问题。不同在于系统调用会有移植性的问题,因为不同系统会有不同的调用函数,速度也有一定差别,通常系统调用比功能调用快,还有一些别的,可以看这里。

库函数(过程)调用和系统调用的区别

在这里插入图片描述

可以看到程序和内核交流基本上就围绕着中断、异常、系统调用。

系统调用( system call )
应用程序主动向操作系统发出的服务请求

异常(exception)
非法指令或者其他原因导致当前指令执行失败 (如∶内存出错)后的处理请求

中断(hardware interrupt)
来自硬件设备的处理请求

中断、异常、系统调用三者的区别:

1、源头

  • 中断: 外设
  • 异常: 应用程序意想不到的行为
  • 系统调用∶应用程序请求操作提供服务

2、响应方式

  • 中断:异步
  • 异常:同步
  • 系统调用:异步或同步

3、处理机制

  • 中断︰持续,对用户应用程序是透明的
  • 异常:杀死或者重新执行意想不到的应用程序指令
  • 系统调用∶等待和持续

1、中断处理机制:

在这里插入图片描述

必须要有使能,否则无法使用中断(之所以设置使能中断的功能是因为有些时候系统要执行一些必须一次性完成的操作,这时候不能够去响应中断,所以就需要暂时关闭中断功能)。

在这里插入图片描述

在这里插入图片描述

2、系统调用

系统调用是操作系统对上提供服务的接口。

在这里插入图片描述

上图为C程序的例子。

在这里插入图片描述
在这里插入图片描述
系统调用的实现

在这里插入图片描述
程序调用系统调用的时候首先通过中断进入到系统内核,然后转到系统调用表,这时候通过中断进来的系统调用的编号会被用来在系统调用表里面查对应的系统调用实现,得到结果之后返回去给程序。

在这里插入图片描述

两种调用使用的堆栈不同。

在这里插入图片描述

系统调用的开销如上图所示。

系统调用示例

在这里插入图片描述
上图左侧是要实现的程序(例子),右侧红色的就是用到的系统调用。

猜你喜欢

转载自blog.csdn.net/qq_44721831/article/details/108700340