主要内容
启动
- 计算机体系结构概述
- 计算机内存和硬盘布局
- 开机顺序
中断、异常和系统调用
- 背景
- 中断、异常和系统调用相比较
- 中断和异常处理机制
- 系统调用的概念
- 系统调用的实现
- 程序调用与系统调用的不同之处
- 开销
操作系统的启动
操作系统启动主要和三部分有关:CPU,存储,I/O。操作系统的启动需要这三部分的配合。再未开机之前,操作系统存放在disk(硬盘)里面。要想让操作系统运转,首先需要得到BIOS的支持。
BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统"。它是一组被写入到主板ROM芯片上的程序,用来控制硬件。BIOS最基础的功能有三个:
1. 加电自检。通电后,BIOS会自动检测与主板相连接的硬件设备是否运行良好。
2. 对硬件进行初始化。BIOS能设置与硬件相关的一些参数。
3. 加载操作系统。BIOS能寻找装载硬盘中的OS并允许。
本文重点介绍BIOS加载操作系统的过程。在硬盘上,除了OS以外,还有一个名为Bootloader的程序,一般放在硬盘的第一个主引导扇区。BIOS在加电自检以后,会将Bootloader从硬盘移动到内存当中。之后BootLoader获得了cpu的控制权,BootLoader在硬盘当中寻找操作系统的起始扇区并确定操作系统的大小,然后将OS的代码和数据从硬盘中读到内存中去,并跳转到OS的起始地址。然后BootLoader将cpu的控制权交给OS,此时,系统加载完毕,整个计算机系统都处于OS的控制之下。
操作系统交互(设备和程序)
操作系统主要有三种交互手段,分别是系统调用,异常和中断。它们的定义如下:
系统调用:应用程序主动向操作系统发出的服务请求。来源于应用程序,目的是让操作系统帮助应用程序完成某个任务。
异常:非法指令或者其他坏的处理状态(如:内存出错),来源于应用程序在执行过程中出现的意想不到的情况。因为异常的出现,使得操作系统必须介入处理。
中断:是外部设备向操作系统提出的请求,来源于外部设备。中断让操作系统意思到,有外部设备希望得到操作系统的支持。
为什么应用程序不能直接访问外设
应用程序访问外部设备必须通过OS,主要原因是操作系统是可信任的软件,应用程序是不可信任的软件。操作系统可以为应用程序提供安全的服务,如果让应用程序访问外设,可能造成系统崩溃。另外,这样可以使上层应用不用关注设备底层实现的细节,使用操作系统提供的接口,可以实现应用程序通用性的提升。即:
- 在计算机运行中,内核是被信任的第三方
- 只有内核可以执行特权指令
- 为了方便应用程序
中断,异常,系统调用的区别和特点
中断 | 异常 | 系统调用 | |
源头 | 外部设备 | 应用程序意想不到的行为 | 应用程序请求操作提供服务 |
处理时间 | 异步 | 同步 | 异步与同步 |
响应 | 持续(对用户持续) | 杀死或者重新执行意想不到的应用程序指令 | 等待和持续 |
中断,异常,系统调用的处理机制
中断的保存与处理机制
中断和异常都有硬件的处理过程和软件的处理过程。
硬件:设置中断标记[CPU初始化]
1.将内部、外部事件设置中断标记
2.中断事件的ID(中断事件的ID指程序访问的中断向量地址)
软件
- 保存当前处理状态
- 中断服务程序处理
- 清除中断标记
- 恢复之前保存的处理状态
异常的处理机制
异常∶异常编号
- 保存现场
- 异常处理
- 杀死产生了异常的程序
- 重新执行异常指令
- 恢复现场
系统调用的处理机制
OS通过系统调用为应用程序提供服务。
程序访问主要是通过高层次的API接口而不是直接进行系统调用
- Win32 API 用于 Windows
- POSIX API用于POSIX-based systems(包括UNIX,LINUX,Mac OS ×的所有版本)
- Java API 用于JAVA虚拟机
通常情况下,与每个系统调用相关的序号
- 系统调用接口根据这些序号来维护表的索引
系统调用接口调用内核态中预期的系统调用
- 并返回系统调用的状态和其他任何返回值
用户不需要知道系统调用是如何实现的
- 只需要获取API和了解操作新系统将什么作为返回结果操作
- 系统接口的细节大部分都隐藏在API中
- 通过运行程序支持的库来管理(用包含编译器的库来创建函数集)
跨越操作系统边界的开销
在执行时间上的开销超过程序调用
开销:
- 建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销
- 建立内核堆栈
- 验证参数
- 内核态映射到用户态的地址空间
- 更新页面映射权限
- 内核态独立地址空间
- TLB