文章目录
- 1. 启动
- 1.1 计算机体系结构概述
- 1.2 计算机内存和硬盘布局
- 1.3 开机顺序
- 2. 中断、异常和系统调用
- 2.1 背景
- 2.2 中断、异常和系统调用相比较
- 2.3 中断和异常处理机制
- 2.4 系统调用的概念
- 2.5 系统调用的实现
- 2.6 程序调用与系统调用的不同之处
- 2.7 开销
1. 启动
1.1 计算机体系结构概述
CPU, I/O, 内存通过总线连接
DISK:存放OS
BIOS:基本I/O处理系统
Bootloader:加载OS
1.2 计算机内存和硬盘布局
1.3 开机顺序
当电脑通电时,段寄存器CS和指令寄存器IP能够确定一个内存地址,例如CS:IP = 0xf000:fff0.
POST(加电自检),寻找显卡和执行BIOS。(显示器,键盘…是否正常)。
步骤:
- BIOS: 将Bootloader从磁盘的磁盘的引导扇区(512字节)加载到0x7c00;跳转到CS:IP=0000:7c00的内存区域(以便下一步)
- Bootloader:将操作系统的代码和数据从硬盘加载到内存中;跳转到操作系统的起始地址。
2. 中断、异常和系统调用
2.1 背景
- 系统调用(来源于应用程序):应用程序主动向操作系统发出服务请求
- 异常(来源于不良的应用程序):非法指令或者其他坏的处理结果(如:内存出错)
- 中断(来源于外设):来自不同的硬件的计时器和网络的中断
为什么应用程序不直接访问外设?
- 计算机中,内核是被信任的第三方
- 只有内核可以执行特权命令
- 为了方便应用程序,通过操作系统向上层提供一个更简单一致的接口
2.2 中断、异常和系统调用相比较
- 源头不同:
中断:外设(如键鼠)
异常:应用程序意想不到的行为(如除0操作)
系统调用:应用程序请求操作提供服务 - 处理时间不同:
中断:异步(程序不知道什么时候产生)
异常:同步(程序执行到某条特定指令一定会产生)
系统调用:异步或同步(发出请求点是同步,返回点可能异步) - 处理响应不一样:
中断:持续,对用户程序是透明的
异常:杀死或者重新执行意想不到的程序指令
系统调用:等待和持续
2.3 中断和异常处理机制
- 中断/异常处理机制
中断是外设的事件,异常是CPU的事件;中断/异常迫使CPU访问一些被中断和异常服务访问的功能。 - 中断处理机制
①硬件:设置中断标记(CPU初始化)
a.将内部/外部事件设置中断标记;
b.中断事件的ID(程序访问的中断向量地址)
②软件(操作系统):
a.保存当前处理状态
b.中断服务程序处理
c.清除中断标记
d.恢复之前保存的处理状态 - 异常处理机制
异常:异常编号
-保存现场
-异常处理:杀死产生异常的程序;重新执行异常指令
-恢复现场
2.4 系统调用的概念
- 一条指令会触发一个系统调用
- 程序访问主要是通过高层次的API接口而不是直接进行系统调用。(Win32——Windows,Java API——JVM……)
- 系统调用时涉及到特权级从用户态到内核态的转换,应用程序和操作系统有各自的堆栈,这两个变化比函数调用的开销更大,但更安全和可靠。(而程序调用是在一个栈空间实现参数的调用和返回)。
2.5 系统调用的实现
- 通常情况下,存在与每个系统调用相关的序号,系统调用接口根据这些序号来维护表的索引。
- 系统调用接口调用内核态中预期的系统调用,并返回系统调用的状态和其它任何返回值。
- 用户不需要知道系统调用是如何实现的,只需要获取API和了解操作新系统将什么作为返回结果。操作系统接口的细节大部分都隐藏在API中,并通过运行程序支持的库来管理。
- 用户态:应用程序在执行的过程中,CPU执行的特权级的状态(很低,不能访问特殊机器指令和IO)。
- 内核态:应用程序在执行的过程中,CPU执行的特权级的状态(高,操作系统可以执行CPU任何一条指令)。
2.6 程序调用与系统调用的不同之处
系统调用时涉及到特权级从用户态到内核态的转换,应用程序和操作系统有各自的堆栈,这两个变化比函数调用的开销更大,但更安全和可靠。(而程序调用是在一个栈空间实现参数的调用和返回)。
2.7 开销
中断、异常和系统调用跨越了操作系统和外设上的相关边界,跨越边界需要一定代价,代价是为了确保系统安全稳定运行。
- 在执行时间上超过程序调用
- 开销包括:
① 建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销;
② 建立内核堆栈(操作系统和应用程序的堆栈不一样);
③ 验证参数(操作系统会检查数据);
④ 内核态映射到用户态的地址空间,更新页面映射权限(内存拷贝开销);
⑤ 内核态独立地址空间TLB。