目录
- OS操作系统系列文章目录
- 第二章:启动、中断、异常和系统调用
- 计算机的启动过程
- 中断、异常、系统调用
- 中断(异步)
- 异常(同步)
- 系统调用(异步或同步)
- 区别
第二章:启动、中断、异常和系统调用
计算机的启动过程
- CPU、I/O、内存 通过总线连接;
- Disk(硬盘):存放OS和Bootloader;
- BIOS(基于I/O处理系统):开机自检外设,并加载相应的软件进行执行;
- Bootloader:加载OS,将OS从硬盘放入到内存中;
- 位于磁盘的第一个引导扇区;
- 会将OS的代码和数据加载到内存中;
- OS加载完成后,会跳转到OS的起始地址,并将控制权交给OS;
- 开机流程:
- 电脑通电,CPU通过
CS:IP = 0xf000:fff0
的内存地址(由硬件设定),执行第一条指令,即启动BOIS;
其中CS
是段寄存器,IP
是指令寄存器; - BIOS首先会进行POST(加电自检),检测各I/O口和外设;
- BIOS将Bootloader从磁盘的引导扇区(512字节)加载到内存0x7c00中;
- 跳转到
CS:IP = 0000:7c00
的内存区域; - Bootloader会将OS的代码和数据从磁盘加载到内存中;
- 跳转到OS的内存位置,至此OS开始执行;
中断、异常、系统调用
中断(异步)
- 中断来源于外设,来自不同的硬件设备的计时器和网络的中断;
- 中断处理流程:
- 先进行硬件部分:
- 将内部、外部事件设置中断标记;
- 中断事件的ID识别;
- 后进行软件部分:
- 保存当前的处理状态(寄存器之类的一些数据);
- 根据中断事件的ID跳转到中断服务程序,中断程序进行处理;
- 清除中断标记,并恢复之前保存的处理状态;
异常(同步)
- 异常来源于不良的应用程序,非法指令或其它坏的处理状态(如:内存出错);
- 异常处理流程:
- 保存现场;
- 异常处理:
- 杀死产生异常的程序;
- 重新执行异常程序;
- 恢复现场;
系统调用(异步或同步)
- 系统调用来源于应用程序,应用程序主动向OS发出服务请求;
程序访问主要是通过高层次的API,而不是直接调用系统;
- API分类
-
Win32 API
用于Windows; -
POSIX API
用于POSIX-based systems(包括UNIX、LINUX、Mac OS X); -
Java API
用于JAVA虚拟机(JVM);
- 特点:
- 一般情况,系统调用都有对应的序号;
而系统调用接口根据这些序号来维护表的索引; - 系统调用接口 ,会去 调用内核态中,预期的系统调用;
并返回系统调用的 状态和其它任何返回值; - 用户不需要知道系统调用是如何实现的;
只需要获取API和了解OS会返回什么结果;
OS接口的细节大部分都会隐藏在API中;
- 用户态:OS运行中,CPU执行的特权级的状态,特权很低,不能访问特殊机器指令和IO,且不能直接执行特权指令;
- 内核态:OS运行中,CPU执行的特权级的状态,特权很高,可以执行CPU任何一条指令;
- 系统调用进行时,涉及到特权级从用户态转到内核态的过程,且应用程序和OS拥有各自的堆栈空间;
这两个变化比函数调用的开销更大,但也更安全和可靠;
(程序调用是在一个栈空间实现参数的调用和返回)
- 跨越OS边界的开销
- 在执行时间上的开销超过程序调用的;
- 开销包括:
- 建立中断、异常、系统调用号与对应服务例程映射关系的初始化开销;
- 建立内核堆栈;
- 验证参数;
- 内核态映射到用户态的地址空间(更新页面映射权限);
- 内核态独立的地址空间(TLB);
区别
类型 | 源头 | 处理时间 | 响应 |
中断 | 外设 | 异步 | 持续,对应用程序透明 |
异常 | 应用程序意想不到的行为 | 同步 | 杀死或重新执行指令 |
系统调用 | 应用程序请求系统提供服务 | 同步或异步 | 等待或持续 |
中断的异步:应用程序不知道什么时候会发生中断
异常的同步:执行到某一条指令一定会发生该异常
- 应用程序不能直接访问硬件
- 在计算机运行时,内核是被信任的第三方;
- 只有内核可以执行特权指令;
- 为了方便应用程序的设计;