操作系统from清华大学向勇,陈渝 笔记(二)操作系统的启动、中断、异常、系统调用

下一篇在这里(三)(四)内存层次和连续、非连续分配
上一篇绪论在这里(一)操作系统绪论
INDEX
2-1 操作系统的启动
2-2 操作系统的中断、异常、系统调用

2-1 操作系统的启动

启动:机器三部分

          &CPU
总线———|———|————|—————
      |         |
      I/O      内存

Disk而不是内存存放OS,BIOS(基本I/O操作系统)提供支持,检测外设。硬盘上有个小程序Bootloader用于加载os。
内存中有一部分是BIOS占满,第一步从特定地址开始执行
CS:IP=0xf000:fff0. (以X86为例)
CS 段寄存器 IP 指令寄存器
之后BIOS会post 加电自检,寻找显卡(找屏幕),有键盘鼠标等外设,BIOS将其初始化;把BOOTLOADER从硬盘上加到内存,自身跳转到CS:IP=0000:7c00

内存区都放的啥BOOTLOADER第一个扇区,即引导扇区,512byte

Bootloader会将OS的代码和数据加载到内存中,把控制权给操作系统(跳转到OS的起始地址)。

2-2 操作系统的中断、异常和系统调用

操作系统正常工作后,与设备和程序交互。
interface包含三个,面向外设通过中断和i/o,面向应用程序通过系统调用和异常。

系统调用:应用程序主动向OS发出服务请求system call,一种特殊指令
异常:不良的应用程序,非法指令或者坏的处理状态
中断:有外设来发送请求了,来自不同的硬件设备的计时器和网络的中断

为什么应用程序不能直接访问外设?
OS 的kernel 是被信任的第三方(安全),是主管manager,只有内核可以执行特权指令,给上层应用提供简单的借口,屏蔽底层device的差异和复杂性,使APP更易用,可移植。

操作系统如何设计和实现中断、异常和系统调用?

三者差异:
1. 源头不一样,网卡声卡显卡等等产生事件—中断;APP意想不到的行为—异常;APP主动请求OS提供服务—系统调用
2. 处理时间不一样。中断:异步;异常:同步;系统调用:同步或异步
异步的含义:当一个事件发生时,APP并不知道它什么时候会发生
异常和系统调用都是一个特定指令触发了事件,同步时间点。
系统调用也有可能异步,当发出请求后返回的时间是异步的。如果APP在发出请求后没有等待,而是干别的去了,返回点是异步的。而请求的点是同步的。
3.响应状态
中断:持续,app对用户是透明的,感觉不到
异常:杀死或重新执行APP的异常指令,也透明
系统调用:等待和持续,不会重复执行

中断和异常的处理机制
中断—-
硬件:设置中断标记(cpu初始化),CPU看到具体的中断事件的ID中断号(程序访问的中断向量地址),根据中断表,访问一些为该事件服务的功能,跳到对应地址。
软件:OS要保存当前程序处理状态,中断服务程序处理(根据具体的时间ID对应功能/地址),清除中断标记,恢复之前保存的处理状态(应用程序是不知道的,是透明的)
异常——
异常编号,OS会保存现场,异常处理(杀死程序or OS修复程序需要的服务后重新执行异常指令),恢复现场。应用程序不知道在执行到特定指令后会产生异常,也是透明的。
系统调用——
应用程序调用printf时会触发系统调用write(),OS再去访问对应的外设。执行后OS返回一个成功或者失败。程序访问主要是通过高层的API接口而不是直接系统调用。常用的有:
Win32 API
POSIX API 通用可移植 linux unix mac os x
最底层就是win32 or posix 定义了操作系统到底能提供哪些系统调用
JAVA API 用于JAVA虚拟机(JVM)

OS是怎么设计和实现系统调用的?
通常,系统调用接口根据与每个系统调用相关的序号维护一个索引表;系统调用接口调用内核态中预期的系统调用,并return状态和other values,用户不需要知道具体实现,只要获取API和了解return 结果,接口的细节都隐藏在API中,通过APP所支持的库来管理(用包含编译器的库来创建函数集)。

APP直接或间接通过library code库访问系统调用的接口,并触发内核态到用户态的转变,控制权从应用程序交到了OS,OS标识ID号后完成具体的服务。
内核态:OS运行中,CPU处的高权限的状态,OS可以执行任何CPU提供的任何指令或调用I/O。
用户态:APP执行中,CPU处的一个较低权限的状态。不能直接访问特殊的机器指令和I/O

系统调用与传统的函数调用区别在两点:
APP发出函数调用时,在一个栈空间完成了函数的传参和返回,系统调用时,应用程序和OS内核各自拥有堆栈,有栈的堆栈和特权级的转换,需要开销,大于函数调用。但相对更安全可靠。

三种行为(中断、异常、系统调用)跨越了OS边界。执行时间上开销超过直接程序调用。开销包括:
1. 初始环节要对事件ID号与对应服务历程建立映射表
2. OS有自己的堆栈,要建立和维护内核堆栈(保存,恢复)
3. 操作系统不信任APP,有验证参数,检查的过程
4. 从内核态映射到用户态的地址空间,如果引起内存变化,更新页面映射权限,
5. 内核态独立地址空间 TLB

是值得的,保证安全可靠。

下一篇操作系统笔记(三)计算机体系结构&内存分层体系
(四)非连续内存分配:分段,分页,页表,TLB

你可能感兴趣的:(操作系统,操作系统,异常,系统调用,中断,用户态)