《操作系统原理》学习笔记:第2章 操作系统基础操作
- 2.1 操作系统的启动
- 2.2 操作系统与设备和程序交互
- 2.3 中断、异常和系统调用三者有什么区别和特点
- 2.4 操作系统如何实现中断、异常和系统调用?
- 2.4.1 中断
- 2.4.2 异常
- 2.4.3 系统调用
2.1 操作系统的启动
DISK:存放OS(操作系统并不是存放在内存中,而是放在磁盘,由BIOS提供支持)
BIOS:基本I/O处理系统(计算机开机后,可以检测各种外设,加载相应软件执行)
1⃣️ BIOS从特定地址开始执行,之后POST(加电自检,寻找显卡和执行BIOS)
2⃣️ BIOS将Bootloader从磁盘的引导扇区加载至内存中一个特定地址(bootloader一般放于磁盘的第一个扇区)
3⃣️ Bootloader将操作系统的代码和数据从硬盘加载到内存中
4⃣️ 跳转到OS的起始地址(将CPU的控制权交给操作系统)
2.2 操作系统与设备和程序交互
- interface的设计问题
面向外设:使用中断,IO进行处理
面向应用程序:使用系统调用和异常提供功能 - 为什么应用程序不能直接访问外设,而要通过操作系统?
在计算机运行中,内核是被信任的第三方
只有内核可以执行特权指令
为了方便应用程序(提供简单一致的接口,应用程序不需要关心底层复杂细节)
2.3 中断、异常和系统调用三者有什么区别和特点
中断 | 异常 | 系统调用 | |
来源 |
|
|
|
处理时间 |
|
|
|
响应 | 持续,对应用程序是透明的 | 杀死或者重新执行意想不到的应用程序指令 | 等待和持续 |
2.4 操作系统如何实现中断、异常和系统调用?
2.4.1 中断
- 硬件
外设产生中断标记
CPU可以得到此中断,产生中断号,将中断号发给操作系统
操作系统根据中断号查询中断表得到具体中断例程的起始地址,跳转到此执行即可。 - 软件(保存与恢复机制)
保存当前被打断的执行现场
中断服务程序处理
清除中断标记
恢复之前保存的处理状态
2.4.2 异常
- 保存现场
- 异常处理(根据不同异常号进行不同处理,比如:杀死产生了异常的程序、重新执行异常执行)
- 恢复现场
2.4.3 系统调用
- 应用程序需要操作系统提供服务,这个接口称为系统调用接口
- 应用系统发出请求,操作系统完成请求后返回成功或失败,应用程序间接控制计算机系统
e.g 应用程序调用printf()时,会触发系统调用write(),调用包含一些参数(哪个设备显示字符串,以及字符串内容)
操作系统获取参数后,去访问对应设备,比如屏幕 - 程序访问主要通过高层次API(而不是直接进行系统调用)
Win32 API用于Windows
POSIX API用于POSIX-based systems(包括UNIX、LINUX、Mac OS X的所有版本)
Java API用于JAVA虚拟机(如果运行在Windows系统还是使用的Win32 API,如果运行在……)
- 应用程序直接或间接通过Library Code访问系统调用接口,会触发从用户态到内核态的转换,从而使得控制权从应用程序交给操作系统,操作系统可以对系统调用ID号做出标识,来识别具体的系统调用,完成相应的服务。
用户态:应用程序在执行过程中,CPU处于特权级较低的状态,不能直接访问某些特殊的机器指令,不能直接访问IO
内核态:操作系统运行中,CPU所处的一种状态,操作系统可以执行任何指令,包括特殊指令,可以完全控制整个计算机系统
系统调用 | 函数调用 | |
是否需切换堆栈 | 应用程序和操作系统内核拥有各自的堆栈,应用程序发出系统调用之后,切换到内核中执行时,需要切换堆栈 | 一个栈空间完成参数的传递和返回 |
开销 | 切换堆栈与用户态到内核态转换,需要开销大 | 开销相对小 |
安全性 | 保证操作系统安全性 |
- 中断、异常、系统调用会跨越操作系统与Devices和app交互,跨越操作系统边界的开销远超过程序调用。这些开销包括:
- 建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销
- 建立内核堆栈(操作系统与应用程序有各自堆栈)
- 验证参数(操作系统在收到应用程序调用后会检查参数)
- 内核态映射到用户态的地址空间,更新页面映射权限(内存拷贝)
- 内核态独立地址空间TLB