第 2 章 操作系统结构
操作系统的服务
- 从用户角度,操作系统有一组服务用于提供用户功能:
- 用户界面:命令行界面(Command-Line Interface, CLI)、批处理界面(batch interface)、图形用户界面(Graphical User Interface, GUI)
- 程序执行:系统加载程序到内存并运行
- I/O 操作
- 文件系统操作
- 通信:通信实现可以通过共享内存或消息传递
- 错误检测:操作系统需要不断检测错误和更正错误,错误可能源于 CPU 或内存硬件(如内存错误或电源故障)、I/O 设备(如磁盘奇偶检验出错、网络连接故障)、用户程序(如算术溢出、企图非法访问内存地址、占用 CPU 时间过长)等
- 从系统角度,有一组操作系统服务通过共享计算机资源确保系统本身运行高效:
- 资源分配
- 记账:记录用户使用资源的类型和数量
- 保护和安全
中断和异常的概念
中断和异常的定义
中断(Interruption)也称外中断,指来自 CPU 执行指令以外的事件的发生,如设备发出的 I/O 结束中断、时钟中断。
异常(Exception)也称内中断,指源自 CPU 执行指令内部的事件,如程序的非法操作码、地址越界、算术溢出、虚存系统的缺页及专门的陷入指令等引起的事件。
中断处理的过程
- 中断各阶段处理流程如下:
- 关中断
- 保存断点
- 中断服务程序寻址
- 保存现场和屏蔽字
- 开中断
- 执行中断服务程序
- 关中断
- 恢复现场和屏蔽字
- 开中断、中断返回
系统调用
系统调用(system call)提供操作系统服务的接口,这些调用通常以 C 或 C++ 编写,某些底层任务(如需直接访问硬件的任务)可能以汇编语言编写。
应用程序开发人员根据应用编程接口(Application Programming Interface, API)来设计程序
系统调用的样子
系统调用的实现
系统调用的过程
系统调用的参数传递
- 向操作系统传递参数有三种常用方法:
- 通过寄存器传递参数
- 参数存在内存的块或表中,而块或表的地址通过寄存器传递(传递参数的数量或长度没有限制)
- 参数可以通过程序放在或压入到堆栈,并通过操作系统弹出
系统调用的类型
- 系统调用可大致分为六大类:
- 进程控制(Process control)
- 文件管理(File management)
- 设备管理(Device management)
- 信息维护(Information maintenance)
- 通信(Communications)
- 保护(Protection)
系统程序
系统程序(system program),也称为系统工具(system utility),为程序开发和执行提供了一个方便的环境。
- 系统程序可分为以下几类
- 文件管理
- 状态信息
- 文件修改
- 程序语言支持
- 程序加载与执行
- 通信
- 后台服务
操作系统的设计与实现
设计目标
机制与策略
一个重要的原则是把策略(policy)和机制(mechanisim)进行分离
策略是可以做什么,即具体实现
机制是如何做,即实现方式
策略可随时间或地点而改变,对策略改变不敏感的通用机制将是更可取的。
实现
操作系统的结构
简单结构
分层方法
微内核
微内核体系结构将内核中最基本的功能(如进程管理等)保留在内核,而将那些不需要再核心态执行的功能移到用户态执行。
移出内核的操作系统代码根据分层的原则被划分为若干服务程序,执行相互独立,交互则都借助于微内核进行通信。
微内核结构有效分离了内核与服务、服务与服务,使它们之间的接口更清晰,维护的代价大大降低,各部分可以独立优化和演进,从而保证操作系统的可靠性。
微内核结构的最大问题时性能问题,因为需要频繁地在核心态和用户态之间进行切换,操作系统的执行开销偏大。
模块
内核模块是可加载的,在操作系统启动时或启动后手动态加载,也可以删除
模块化决定配置灵活、动态
内核提供核心服务,其他服务可在内核运行时动态实现
混合系统
组合不同的结构从而形成混合系统,以便解决性能、安全性和可用性等问题
虚拟机
宿主操作系统:真实硬件
客户端操作系统:虚拟硬件,本质上是有模拟能力的软件
操作系统的生成
编译后产生一个在磁盘上的镜像文件
启动时将镜像文件加载到内存中运行
系统引导(System Boot)
bootstrap program/bootstrap loader:定位内核病假子啊到内存开始执行
Grub: Linux 的一种 bootstrap loader,能管理多个内核镜像,选择启动哪一个
Loadlin: Linu 的一种更轻量级的 bootstrap loader
bootstrap loader 通常存放在硬盘上的引导记录中,ROM 加电后会指示计算机去加载 bootstrap loader