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 GRUB,LILO详细介绍,bootloader 详细介绍。

LILO GRUB
无交互命令界面 有交互命令界面
不支持网络引导 支持
错误配置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秒执行10910^9109条指令,而典型的硬盘转速为每分钟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)。

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

  1. 《LINUX3.0内核源代码分析》第二章:中断和异常 【转】

    转自:http://blog.chinaunix.net/uid-25845340-id-2982887.html 摘要:第二章主要讲述linux如何处理ARM cortex A9多核处理器的中断.异 ...

  2. Xv6操作系统导论(第二章)

    第二章 操作系统架构 操作系统的一个关键要求是同时支持多个活动.例如,使用第1章中描述的系统调用接口,一个进程可以用fork启动新进程.操作系统必须在这些进程之间分时使用计算机资源.例如,即使进程比硬 ...

  3. 操作系统课后答案第二章

    **第二章 进程的描述与控制** 第二章 进程的描述与控制 1.什么是前驱图?为什么要引入前驱图? 答:前驱图:前驱图是一个有向,不循环图.用于描述进程之间执行的先后关系.图中每个点可以表示一个程序段 ...

  4. 操作系统 课堂笔记 第二章 进程管理

    第二章 进程管理 2.1 本章导学 基本内容: (1)进程的基本概念. (2)进程控制. (3)进程间互斥与同步. (4)进程通信. (5)进程调度. (6)进程死锁. (7)线程. 学习重点: (1 ...

  5. 操作系统练习题(第二章)

    保留所有权利,禁止任何未经授权的转载. 注意:二次转载,即我授权A转载,B转载A并说这是从A那里转载而不是从我,这是不行的... 关于本专栏,请查阅第一篇文章前言 操作系统练习题(第一章) 本章另行参 ...

  6. [No000035]操作系统Operating System之OS Interface操作系统接口

    接口(Interface) 仍然从常识开始- 日常生活中有很多接口:电源插座:汽车油门- 那什么是接口? 连接两个东西.信号转换.屏蔽细节- Interface: electrical circuit ...

  7. 操作系统原理:操作系统的启动 中断/异常/系统调用

    操作系统的存储刚开始并不是内存里,而是先放在硬盘DIsk上   .由BIOS(基本输入输出系统)提供支持. 开机时,BIOS首先检查外设,检查完没问题.再加载相应的软件 . Bootloader: 这 ...

  8. 计算机操作系统学习笔记 第二章、进程与线程

    文章目录 1 进程和线程 1.1 进程的概念和特征 1.1.1 进程的概念 1.1.2 进程的特征 1.2 进程的状态与转换 1.3 进程的组织 1.4 进程控制 1.5 进程通信 1.5.1 共享存 ...

  9. 操作系统学习笔记 第二章:进程管理(王道考研)

    本文章基于 2019 王道考研 操作系统 考试复习推荐资料:操作系统复习总结 - 百度文库 (baidu.com) 需要相关电子书的可以关注我的公众号BaretH后台回复操作系统 第一章:操作系统概述 ...

  10. 操作系统学习笔记——第二章 进程的描述与控制(二)

    2.3 进程控制 进程控制是对系统中的全部进程实施有效的管理,包括进程创建.终止.进程阻塞和唤醒. 一.进程的创建 二.进程的终止 三.进程的阻塞与唤醒 四.进程的挂起与激活 一.进程的创建 创建原语 ...

最新文章

  1. 人人都能看懂LSTM
  2. eclipse rcp应用程序重启
  3. android7.1 shotcuts,Android N App Shotcuts 学习
  4. rxjs里switchMap operators的用法
  5. MyBatis多表查询(一对一,一对多,多对多)
  6. 微课|玩转Python轻松过二级(2.2.1节):算术运算符
  7. IIS Express介绍与使用
  8. c语言小学生加法考试题程序4,c语言编程题与答案4.doc
  9. 每天一道剑指offer-顺时针打印矩阵
  10. HAWQ取代传统数仓实践(一)——为什么选择HAWQ
  11. Anaconda下载(Windows系统)
  12. 图形验证码文字识别——pytesseract
  13. java类名不能以数字开头_java变量为什么不能以数字开头
  14. cadence如何导入gds_Tanner LEdit系列 | 导入GDSII文件
  15. python爬虫— 利用js2xml 获取 script 数据
  16. HDU - 7047 - Link with Balls ( 插板法 + 组合数 )
  17. Linux中usb设置burst,详细解读Linux系统中ntpq命令的使用
  18. fragment 淡入淡出_Android ViewPager随着不同的动画,如放大,淡入淡出等
  19. 【Java】Java中文分词器Ansj的使用
  20. 张艾迪(创始人):视觉计算极简主义的设计

热门文章

  1. Arduino UNO R3开发板+MQ-2烟雾浓度传感器+火焰传感器+舵机+无源蜂鸣器+风扇+步进电机+WIFI模块+RGB三色LED灯+SIM900A所构成的室内安全报警模块
  2. 【转】java虚拟机学习笔记1
  3. 用户画像user portrait
  4. 奔驰怪兽CGMB功能介绍
  5. IDC:预计2018年全球物联网支出将达7725亿美元
  6. 一招简单粗暴解决开机慢的问题,实现快速开机高效办公
  7. 微信公众号分享、支付开发
  8. dhcp的安装与使用
  9. ESP32-S2应用开发——USB通信(CDC类)
  10. TiDB 4.0 为解决热点问题做了哪些改进?