第二讲 操作系统实验
实验内容
对操作系统的理解
- 计算机科学与计算机工程相结合
- 原理和实验教学内容并行进行
- 强调动手编程实践
- 实验需求 理解系统, 循序渐进, 阅读代码, 把握全局, 功能完善,改进创新
软件环境
- 大量采用开源软件
- 实验环境: Windows/Linux
- 源码阅读工具: understand
- 源码文档自动生成工具: Doxygen
- 编译环境: gcc, make, Binutils
- 真实/虚拟运行环境: X86机器或QEMU
- 调试工具: 改进的QEMU + (GDB O.R.IDE)
IDE工具: Eclipse-CDT实验内容
- OS启动, 中断与设备管理 200-1800
- 物理内存管理 1800-2500
- 虚拟内存管理 2500-3200
- 内核线程管理 3200-3600
- 用户进程管理 3600-4300
- 处理器调度 4300-5100
- 同步互斥 5100-6400
- 文件系统 6400-9999
Lab1: Bootloader/Interrupt/Device Driver
Lab2: 物理内存管理
- 理解x86分段/分页模式, 了解操作系统如何连续管理连续空间的物理内存
- 理解内存地址的转换和保护
- 实现页表的建立和使用方法
- 实现物理内存的管理方法
- 了解常用的减少碎片的方法
Lab3: 虚拟内存管理
- 了解页表机制和换出(swap)机制, 以及中断- “故障中断”, 缺页故障处理等, 基于页的内存替换算法
- 理解换页的软硬件协同机制
- 实现虚拟内存的Page Fault异常处理
- 实现页替换算法
Lab4: 内核线程管理
- 了解如果利用CPU来高效地完成各种工作的设计与实现基础, 如何创建相对于用户进程更简单的内核态线程,如何对内核线程进行动态管理.
- 建立内核线程的关键信息
- 实现内核线程的管理方法
Lab5: 用户进程管理
- 了解用户态进程创建, 执行, 切换和结束的动态管理过程, 了解用户态通过系统调用得到内核态的内核服务的过程.
- 建立用户进程的关键信息
- 实现用户进程管理
- 分析进程和内存管理的关系
- 实现系统调用的处理过程
Lba6: 进程调度
- 用于理解操作系统的调度过程和调度算法
- 熟悉ucore的系统调度器框架, 以及内置的Round-Robin调度算法
- 基于调度器框架实现的一个调度器算法
Lab7: 同步互斥
- 了解进程间如何进行信息交互和共享, 并了解同步互斥的具体实现以及对系统性能的影响, 研究思索产生的原因, 以及如何避免死锁
- 熟悉ucore的同步互斥机制
- 理解基本的spinlock, semphpore, condition variable的实现
用各种同步机制解决同步问题Lab8: 文件系统
- 了解文件系统的具体实现, 与进程管理等的关系, 了解缓存对操作系统IO访问的性能改进, 了解虚拟文件系统(VFS), buffer cache和disk driver之间的关系
- 掌握基本的文件系统调用的实现方法
- 了解一个基于索引节点组织方式的SimpleFS文件系统的设计与实现
- 了解文件系统抽象层-VFS的设计与实现
实验准备
安装实验环境
- 在虚拟机上使用安装好的ubuntu实验环境
使用实验工具- shell命令
系统维护工具: apt, git
源码阅读与编辑工具: eclipse-CDT, vim
源码比较工具: diff, meld
开发编译工具: gcc, gdb, make
硬件模拟器: qemu了解 x86-32硬件
Intel 80386 运行模式概述
- 实模式, 保护模式, SMM模式, 虚拟8086模式
- 实模式: 80386加电启动后处于实模式运行状态, 这种状态下软件可访问的物理内存空间不超过1M, 无法发挥80386以上级别的32位CPU的4GB内存管理能力.
- 保护模式: 支持内存分页, 支持优先级机制,不同软件优先级不同 0-3级别, 操作系统处于0级, 应用程序在较低级别
Intel 80386 内存架构概述
Intel 80386 寄存器概述
了解ucore编程方法和通用数据结构
- 面向对象编程方法
- 通用数据结构