02-操作系统的启动及中断
02-操作系统的启动及中断
一 操作系统的启动
1. 计算机体系结构概述
DISK:存放OS
BIOS:基本I/O处理系统, 通电后计算机系统检测各种外设,加载相应软件来执行
DISK:Bootloader 加载OS, 将OS加载到内存里面
计算机硬盘上存储的有BootLoader和操作系统两个软件
2. 计算机内存和硬盘布局
3. 开机顺序
BIOS是基本I/O处理系统,在计算器启动后,计算机就由BIOS接管,BIOS将BootLoader从硬盘的引导扇区(512字节)加载到0x7c00, 跳转到CS:IP=0000:7c00
BootLoader将操作系统的代码和数量从硬盘加载到内存中 跳转到操作系统的起始地址
二 中断、异常和系统调用
1. 背景
操作系统是如何与设备和程序进行交互的?就涉及到操作系统的3个接口
操作系统的接口就是中断、异常和系统调用
中断、异常和系统调用相比较
操作系统面向外设的接口是中断和I/O
面向应用是通过异常和系统调用进行处理的
**定义**
系统调用(来源于应用程序)
应用程序主动向操作系统发出服务请求
异常(来源于不良的应用程序)
非法指令或者其他坏的处理状态(如:内存出错)
中断(来源于外设)
来自不同的硬件设备的计时器和网络的中断
为什么应用不能直接访问外设?还要经过操作系统?
1)在计算机运行中,内核是被信任的第三方 2) 只有内核可以执行特权指令 3) 为了方便应用程序
异同对比
源头
中断:外设
异常:应用程序意想不到的行为
系统调用:应用程序请求操作系统提供服务
处理时间
中断:异步
异常:同步
系统调用:异步或同步
响应
中断:持续,对用户应用程序是透明的
异常:杀死或者重新执行意向不到的应用程序指令
系统调用:等待和持续
2. 中断和异常处理机制
中断是外设的事件
异常是内部CPU的事件
中断和异常迫使CPU访问一些被中断和异常服务访问的功能
硬件
设置中断标记(CPU初始化)
- 将内部外部事件设置中断标记
- 中断事件的ID
中断事件的ID指程序访问的中断向量地址
软件 - 保存当前处理状态
- 中断服务程序处理
- 清除中断标记
异常:异常编号
- 保存现场
- 异常处理
杀死产生了异常的程序
重新执行异常指令 - 恢复现场
3. 系统调用的概念
程序访问主要是通过高层次的API接口而不是直接进行系统调用
Win32 API用于Windows
POSIX API用于POSIX-based systems(包括UNIX,LINUX, Mac OS X的所有版本)
Java API 用于Java虚拟机(JVM)
通常情况下,与每个系统调用相关的序号
- 系统调用接口根据这些序号来维护表的索引
系统调用接口调用内核态中预期的系统调用 - 并返回系统调用的状态和其他任何返回值
用户不需要知道系统调用是如何实现的 - 只需要获取API和了解操作系统将什么作为返回结果
- 操作系统接口的细节大部分都隐藏在API中
- 通过运行程序支持的库来管理(用包含编译器的库来创建函数集)
4. 系统调用的实现
用户态:应用程序在执行的过程中,CPU所处的特权级的状态,特权级很低,不能够直接访问某些特殊的机器指令,也不能直接访问IO
内核态:操作系统运行过程中,CPU所处的状态,操作系统可以执行任何指令,包括特权指令和访问IO的指令,可以完全控制整个计算机系统
当应用程序调用一个系统调用的时候会完成用户态到内核态的一个转换,使得CPU控制权从应用交到了操作系统
5. 程序调用与系统调用的不同之处
应用程序发布函数调用,是在一个栈空间完成调用
系统调用会需要完成栈的切换,还有用户态到内核态的切换
6. 开销
跨越操作系统边界的开销
- 在执行时间上的开销超过程序调用
- 开销
- 建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销
- 建立内核堆栈
- 验证参数
- 内核态映射到用户态的地址空间 更新页面映射权限
- 内核态独立的地址空间 TLB
这些开销保证了系统的安全性