操作系统-Operating-System第二章:启动、中断、异常和系统调用

B站资源:操作系统_清华大学(向勇、陈渝)

Github资源:chyyuu/os_course_info

参考书籍:Operating systems: internals and design principles

Operating System Concepts

MIT公开课:6.828: Operating System Engineering

启动

"启动"的英文,boot原意指靴子,但是在计算机中却被翻译成启动。主要是因为boot和bootstrap的缩写,来自以下谚语:

pull oneself up by one’s bootstraps.

通过拉自己的鞋带将自己拽起,显然这是个矛盾的事情。最早,工程师就用这句谚语来比喻早期的计算机开启。计算机的启动需要运行程序,但是运行程序又需要计算机启动,这个过程也很矛盾。早期为了开机,必须将一小段程序装进内存,这样计算机才可以正常启动,所以工程师们将这个过程叫做“拉鞋带”,之后就被简称为boot;

整个启动过程主要分为四个阶段:BIOS启动–>MBR读取–>BootLoader执行–>系统加载

BIOS启动

在上个世纪70年代,“只读内存”(read-only memory,缩写为ROM)被发明,开机程序被刷入ROM芯片(BIOS与硬件系统集成在一起(计算机主板上的ROM或者EEFROM),所以也被称为固件。),计算机通电的第一件事情就是初始化固件(芯片集),读取它,而这块芯片里面的程序就叫做"基本输入输出系统"(Basic Input/Output System),简称BIOS。

BIOS内部被分为两块区块:

code block(普通程序)

boot block(引导程序)

上电后,boot block会被执行,并检查code block的代码是否正确,如果正确,则转到code block继续执行。

ROM断电不会丢失内容,因此保证了“拽着鞋带拉起自己”的情况不会发生,系统一上电,处理器就会执行第一条指令地址,被定为到BIOS存储器,初始化开始,在X86中,CPU加电后跳转至BIOS的固定物理地址0XFFF0

但是BIOS启动方式大多都由汇编开发,效率较低,代码与设备的耦合度较高,受硬件的影响较大。除此之外也存在性能、扩展性的问题,之后UEFIUnified Extensible Firmware Interface统一可扩展固件界面)便横空出世。UEFI是一种个人电脑系统规格,用来定义操作系统与系统硬件之间的软件界面,作为BIOS的替代方案。细节可以参考计算机启动过程UEFI启动和Bios(Legacy)启动的区别。最为明显的区别就是UEFI启动是不需要硬件检测过程的

BIOS过程

UEFI过程

MBR读取

计算机中可能会存在多个存储设备,例如硬盘、可移动硬盘、U盘等,计算机可以根据用户对这些设备设定的优先级进行优先启动。则BIOS会根据这个顺序将计算机的控制权交给排在第一位的存储设备。而这个排位第一的存储设备的第一个扇区也被称为主引导记录MBR(Master Boot Record),容量仅仅只有512字节,放不了太多的东西,存储着启动引导过程的一小部分计算机代码,告诉计算机去硬盘的哪一个位置去找操作系统。主要可以分为三个部分:

  1. 第1-446字节:调用操作系统的机器码;
  2. 第447-510字节:分区表(Partition table);
  3. 第511-512字节:主引导记录签名(0x55和0xAA)。

BootLoader执行

BootLoader又叫做操作系统内核加载器(OS Kernel Loader),是电脑上电后执行的第一条程序,因此绝对不会依赖于内核。Linux最先上是通过LILO(LInux LOader)引导的,后来又出现了GNU的软件GRUB(GRand Unified Bootloader),这2种Bootloader广泛应用在X86的Linux系统上。你的开发主机可能就使用了其中一种,熟悉它们有助于配置多种系统引导功能。详细可参考:GNU GRUBLILO详细介绍bootloader 详细介绍

LILOGRUB
无交互命令界面有交互命令界面
不支持网络引导支持
错误配置MBR回让系统无法引导如果配置文件错误,则默认跳转到GRUB命令行界面
(曾经刷机遇到过GRUB黑屏界面:Win+ubuntu单硬盘双系统安装(雷神新911机型

以GRUB为例,GRUB加载后首先进行内存盘初始化,BootLoader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统之前先访问内存中的 initrd 文件系统。详情见计算机启动过程

Kernel加载

参考:计算机启动过程

主要有两个步骤:

  1. 根据grub设定的内核映像所在路径,系统读取内存映像,进行解压操作;
  2. 将解压后的内核放在内存之中,初始化函数各种设备,完成Linux核心环境的建立。

以Linux系统为例,先载入/boot目录下面的kernel。

内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件(Debian系统是/etc/initab)产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。

然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入username和password。

至此,全部启动过程完成。

总结

中断、异常、系统调用

背景

为什么需要中断、异常和系统调用?

  1. 在计算机运行中,内核是被信任的第三方;
  2. 只有内核才可以执行特权指令;
  3. 为了方便应用程序。

中断

几乎所有计算机都提供了一种机制,其他模块(I/O,内存)可以通过该机制中断处理器执行的正常顺序,这就是中断。中断的一个主要作用就是提高处理器的利用率。大多数I/O设备比处理器运行慢的多。一台计算机主频为1Ghz,允许1秒执行 1 0 9 10^9 109条指令,而典型的硬盘转速为每分钟7200转,半磁道旋转时间为4ms,比处理器慢了400万倍。硬件通常可以通过系统总线向CPU发送信号来随时触发中断。 (计算机系统中可能有很多总线,但是系统总线是主要组件之间的主要通信路径。)中断也用于许多其他目的,并且是操作系统和硬件交互方式的关键部分

中断的常见类型:

源头触发事件
程序指令执行错误,例如算术溢出、除0、执行一条非法机器指令、用户允许的存储空间以外的引用。
计时器产生于处理器的计时器。这使操作系统可以定期执行某些功能。
I/O产生于I/O控制器,表示操作已完成并且表示各种错误情况。
硬件故障产生于硬件故障,例如电源故障或者内存奇偶校验错误。

下图为用户将执行并处理一些列交错的WRITE调用。其中I/O部分分为3块:

  1. ④:为实际的I/O操作准备一系列指令,可能包括要复制到缓存区中的数据,并为设备命令准备参数;
  2. I/O命令:在没有中断的情况下,一旦该命令被激活,程序就会等待I/O设备的请求。程序也会在等待期间通过重复的测试执行来决定此次I/O执行是否完成。
  3. ⑤:一系列指令用来完成I/O执行。并设置一个标志位表示此次执行操作是否成功。

异常

和中断不同的是,异常的产生来源于不良的应用程序(中断产生于硬件、外设)。在应用程序或者操作系统执行期间,如果处理器检测到程序错误,就会产生一个或者多个异常。异常发生在处理器执行一条指令时,检测到一个出错条件时发生,例如被0除出错条件。处理器可以检测到各种出错条件,包括违反保护机制。页错误以及机器内部错误。为了有助于处理异常和中断,每个需要被处理器进行特殊处理的处理器定义的异常和中断条件都被赋予了一个标识号,称为向量。处理器把赋予异常或中断的向量用作中断描述符表IDT中的一个索引号,来定位一个异常或中断的处理程序入口点位置。允许的向量号范围是0到255.其中0到31保留用作80x86处理器定义的异常和中断,不过目前该范围内的向量号并非每个都已定义了功能,未定义功能的向量号将留在以后使用。范围在32到255的向量号用于用户定义的中断。这些中断通常用于外部I/O设备,使得这些设备可以通过外部硬件中断机制向处理器发送中断。详情可见:操作系统学习(十三) 、中断和异常

类别原因异步/同步返回行为
中断来自I/O设备的信号异步总是返回到下一条指令
陷阱有意的异常同步总是返回到下一条指令
故障潜在可恢复的错误同步可能返回到当前指令
终止不可恢复错误同步不会返回

系统调用

以通用的UNIX体系结构(下图)为例,用户程序可以直接唤醒操作系统服务或者通过程序库实现。系统调用层接口就是用户的边界,它允许更高级别的软件访问特定的内核程序,应用程序主动向OS发出服务请求。系统中的各种共享资源都由操作系统统一各种共享资源都由操掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、进行I/0传输以及管理文件等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。通常,一个操作系统提供的系统调用命令有几十乃至上百条之多。

按照功能可以将系统调用分为如下几类:

  1. 设备管理。完成设备的请求或释放,以及设备启动等功能;
  2. 文件管理。完成文件的读、写、创建及删除等功能;
  3. 进程控制。完成进程的创建、撤销、阻塞及唤醒等功能;
  4. 进程通信。完成进程之间的消息传递或信号传递等功能;
  5. 内存管理。完成内存的分配、回收以及获取作业占用内存区大小及始址等功能。

区别

源头

中断:外设(硬件)

异常:应用程序意想不到的行为(软件)

系统调用:应用程序请求操作提供服务

响应方式

中断:异步(异步中断是由CPU的外设产生额电信号引起的中断,其发生的时间点不可预测)

异常:同步

系统调用:异步或者同步

处理机制

中断:持续,对用户程序是透明的

异常:杀死或者重新执行意想不到的应用程序指令

系统调用:等待和持续

用户态到内核态的过渡

由于操作系统和用户都共享计算机系统中的硬件和软件资源,因此系统必须确保错误(或者恶意)的程序不会导致其他程序(或操作系统本身无法)正确执行。为了保证系统的正常运作,我们必须区分操作系统代码和用户自定义代码。大多数计算机系统采用的方法是提供硬件支持,以允许在各种模式之间进行区分。因此,我们需要两种独立的操作模式:用户模式(用户态 user mode内核模式(内核态 kernel mode(也成为管理员模式,系统模式或者特权模式)。提供单独的一个位,用来表示当前模式:内核(0)或者用户(1);使用模式位,我们可以区分操作系统当前执行的任务属于系统代码还是用户代码。当用户在用户模式下运行程序时,系统处于用户模式。但**当用户应用程序向操作系统请求服务时(通过系统调用),系统必须从用户态过渡到内核态才可以完成请求**。

在系统启动时,硬件以内核模式启动。 然后,将加载操作系统并以用户模式启动用户应用程序。 每当发生陷阱或中断时,硬件就会从用户模式切换到内核模式(即,将模式位的状态更改为0)。 因此,每当操作系统获得对计算机的控制权时,它就处于内核模式。 在将控制权传递给用户程序之前,系统始终会切换到用户模式(通过将模式位设置为1)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuanbaoQiang

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值