目录

  • 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);

区别

类型

源头

处理时间

响应

中断

外设

异步

持续,对应用程序透明

异常

应用程序意想不到的行为

同步

杀死或重新执行指令

系统调用

应用程序请求系统提供服务

同步或异步

等待或持续

中断的异步:应用程序不知道什么时候会发生中断

异常的同步:执行到某一条指令一定会发生该异常

  • 应用程序不能直接访问硬件
  • 在计算机运行时,内核是被信任的第三方;
  • 只有内核可以执行特权指令;
  • 为了方便应用程序的设计;