什么是操作系统
管理软/硬件资源,为程序提供服务的程序
理解操作系统
“精准”的定义毫无意义
操作系统如何从一开始变成现在这样的?
- 三个重要线索
- 计算机(硬件)
- 程序(软件)
- 操作系统(管理软件的软件)
操作系统=对象+API(应用视角/设计)=C程序(硬件视角/实现)
操作系统基础操作
操作系统的启动
Bootloader:加载OS(硬盘->内存),使从cpu执行操作系统
BootLoader一般位于硬盘的第一个主引导扇区 (一个扇区的大小为512Byte)
1.POST(加电自检):寻找显卡和执行BOIS
2.BOIS把BootLoader从硬盘加载到内存
操作系统与设备和程序的交互
定义
-
系统调用(来源于应用程序)
应用程序主动向操作系统发出服务请求
-
异常(来源于不良的应用程序)
非法指令或者其他坏的处理状态(如:内存出错)
-
中断(来源于外设)
来自不同的硬件设备的计时器和网络的中断
为什么应用程序不能直接访问外设而要借助操作系统呢?
- 在计算机运行中,内核是被信任的第三方
- 只有内核可以执行特权指令
- 为了方便应用程序
中断异常系统调用的区别
源头 | 处理时间 | 响应 | |
---|---|---|---|
中断 | 外设 | 异步 | 持续,对用户应用程序是透明的 |
异常 | 应用程序意想不到的行为 | 同步 | 杀死或重新执行意想不到的应用程序指令 |
系统调用 | 应用程序请求操作系统提供服务 | 异步或同步 | 等待和持续(等待服务完成之后继续执行) |
系统调用发出请求的那个点是同步的,但是返回的那个点可能是异步的
中断和异常处理机制
- 中断是外设的事件
- 异常是内部CPU的事件
- 中断和异常迫使CPU访问一些被中断和异常服务访问的功能
硬件
设置中断标记[CPU初始化]
1.将内部、外部事件设置中断标记
2.中断事件的ID
软件
-
保存当前处理状态
-
中断服务程序处理
-
清除中断标记
-
恢复之前保存的处理状态
异常
- 保存现场(产生异常这条指令的地址,以及当前一些寄存器保存的内容等)
- 异常处理
- 杀死产生了异常的程序
- 重新执行异常指令
- 恢复现场
系统调用
标准C库的一个例子
- C语言中,应用程序调用
printf()
时,会触发系统调用write()
程序访问主要是通过高层次的API接口而不是直接进行系统调用
- Win32 API用于Windows
- POSIX API用于POSIX-based systems(包括UNIX Linux Mac OS X的所有版本)
- Java API用于Java虚拟机(JVM)
通常情况下,与每个系统调用相关的序号,系统调用接口根据这些序号来维护表的索引
系统调用接口调用内核态中预期的系统调用,并返回系统调用的状态和其他任何返回值
用户不需要知道系统调用是如何实现的,只需要获取API和了解操作新系统将什么作为返回结果,操作系统接口的细节大部分都隐藏在API中,通过运行程序支持的库来管理(用包含编译器的库来创建函致集)
跨越操作系统边界的开销
中断,异常,系统调用其实是跨越了操作系统的边界,保证了整个系统安全稳定正常的运行,所以会有必要的开销
-
在执行时间上的开销超过程序调用
-
开销
-
建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销
-
建立内核堆栈
-
验证参数
-
内核态映射到用户态的地址空间
更新页面映射权限
-
内核态独立地址空间
TLB
-