- v1
- v2:2020年10月21日提交给系里的版本;
- v3: 21 Oct 2020
- v4: cooperate with 2021-spring labs
- v5: 2021年秋季学期结束时更新教学内容部分
- v6: Current for 2022 spring
操作系统是计算机系统中负责管理各种软硬件资源的核心系统软件,掌握操作系统的基本原理及其设计实现技术是研究型大学计算机专业本科毕业生的基本要求。
本课程是计算机专业核心课,从计算机系统的视角进行内容组织与调整,以教学操作系统uCore/rCore和risc-v CPU为实验环境,讲授操作系统的概念、基本原理和实现技术,并介绍部分当前操作系统研究热点和论文,帮助学生了解和掌握大型复杂系统软件的分析方法和核心设计思路,并为学生充分利用操作系统功能进行应用软件研究和开发打下扎实的基础。
让同学重视实践和原理的结合,围绕OS的视角,结合编译/组原等,深入地理解计算机软硬件系统。
- 逻辑性和实验相关性有折衷
- 内容有点分散
- 多核是否要加强和贯穿?
- ppt: 风格不一致 Latex, ppt, 统一:中文,用markdown marp
- 增加基于Linux的用户态编程和程序展示
- 搭环境的过程,助教提供(文档或视频)
- 原则:与实验一致,尽量不存在1.5次的情况, 比如 进程 + 调度 2次课, 1或2次课对应着1章,可以通过深入讲解来确保上课时间用满。
- 要加实验(缺页异常的处理) ,练习:各种置换算法 (模拟算法)
- 在合适的地方讲解多核的内容(第8讲开始)
- 左文字,右图
- 每次课的知识点明确
- 加页码
- 标明出处(代码,文档,图片等)
- rt-book-v3每章的练习要改
- 学生大概率会忘掉以前的讲解(课后不会复习),所以在本次课开始之前,可以把上一次课回顾一下(大约10~15分钟)。
- 课后练习(可能包括上课内容,不仅仅是实验的内容)
- 选择1: 实验一~~五:40% 期中+期末:60%
- 选择2: 一个月内完成实验一~~五:40% 扩展实验(大实验,课程设计):60%
下面的每一讲大约是三个课时左右
- 课程概述&教学安排
- 什么是操作系统 定义/分类/抽象/特征
- 操作系统历史演化
- 操作系统结构
- 实践:UNIX/Linux类应用
- 掌握操作系统的定义:能从软件角度、资源管理角度定义操作系统及其所属范围
- 掌握操作系统的抽象:理解进程、文件、地址空间的抽象对象以及与硬件关系
- 掌握操作系统的特征:理解并发/并行、共享、虚拟化、异步的含义
- 掌握操作系统的历史:理解单用户系统、批处理系统、多道程序系统、分时系统、个人计算机、SMP系统、VMM系统、分布式系统中的操作系统特征
- 掌握操作系统的架构:理解简单单体/分层单体/复杂单体/微/外/VMM kernel的特点
- 掌握 计算机硬件与操作系统的关系:理解硬件与操作系统之间的interface和各自的主要工作
- 掌握 应用与操作系统的关系:理解应用与操作系统之间的interface和各自的主要工作
- 能分析硬件的哪些功能能够给操作系统提供哪些支持
- 能对一个计算机系统中的软硬件的特征、区别、关系、运行状态进行清晰判断
- 对操作系统有一个完整的总体分析
- 能编写/运行基本的UNIX类程序
- 能在Linux环境下进行操作和编程
- 能够完成 rt-v3::ch0的相关练习
- 实践与实验简要分析(站在应用/OS的角度理解rt-v3)
- 库级支持
- 批处理支持
- 多道程序与分时多任务
- 支持地址空间
- 支持文件系统
- 支持进程间通信
- 并发支持
- 管理I/O设备
- Compiler与OS
- 通用的编译
- 硬件启动与软件启动
- 实践:裸机程序 -- LibOS
- 基本环境搭建
- RV基本组成
- QEMU模拟器
- QEMU启动
- 程序内存布局
- 编译流程
- 理解操作系统实验设计的基本思路
- 理解操作系统提供的实验要达到的基本目标
- 理解函数调用的设计与执行细节
- 理解编译器与操作系统的共识
- 理解硬件与操作系统的共识
- 理解计算机加电后硬件和软件的启动过程
- 理解程序的执行过程
- 了解RV的SBI
- 了解当前的OS各部分的联系与交互
- 能够搭建实验环境
- 能够Debug OS实例
- 能编写裸机程序
- 灵活应用目前掌握的操作系统知识解决裸机编程相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch1的LibOS设计思路和实现的成效
- 能够完成 rt-v3::ch1的相关练习
- 从 OS 角度看计算机系统
- 从 OS 角度看RISC-V
- 实践:批处理操作系统
- 应用程序设计
- 加载应用程序
- 特权级切换
- 理解特权级
- 理解软件如何面向特权级进行编程
- 理解系统调用的概念、设计与实现、执行过程
- 理解批处理操作系统的设计与实现
- 理解程序/批处理操作系统的执行过程
- 了解当前的OS各部分的联系与交互
- 描述基于RV硬件/和软件协调实现系统调用
- 分析RV中的异常与系统调用之间的关系
- 分析并编程举例如果不遵守特权级约束会产生的后果:异常
- 灵活应用目前掌握的操作系统知识解决批处理/特权级相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch2的Batch OS设计思路和实现的成效
- 能够完成 rt-v3::ch2的相关练习
- 相关背景与基本概念
- 多道程序概念
- 分时多任务概念
- 协作式调度
- 抢占式调度
- 中断处理
- 实践:多道程序与分时多任务操作系统
- 上下文切换
- 协作式调度
- 中断机制
- 抢占式调度
- 从开发者/应用/操作系统的角度来理解:什么是任务(进程的初级阶段)
- 理解任务生命周期的状态转换关系和时机
- 理解任务切换的概念与任务切换的设计实现之间的关系和差异
- 理解中断和异常的区别和关系
- 了解当前的OS各部分的联系与交互
- 灵活应用目前掌握的操作系统知识解决多道程序/分时多任务/任务切换相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch3的Multiprog OS和TimeSharing OS设计思路和实现的成效
- 能够完成 rt-v3::ch3的相关练习
- 能够完成实验一
- 地址空间
- 计算机体系结构和内存层次
- 内存分配
- 静态内存分配
- 动态内存分配
- 连续内存分配
- 非连续内存分配
- 段式存储管理
- 页式存储管理
- 段页式存储管理
- 实践:建立地址空间的操作系统
- 管理sv39多级页表
- 内核与应用的地址空间
- 基于地址空间的分时多任务
- 页表自映射(option)
- 理解地址空间的概念
- 理解静态内存分配与动态内存分配的区别与关系
- 理解连续内存分配与不连续内存分配的区别与关系
- 理解段式存储管理的基本设计管理
- 理解页式存储管理的基本设计、多级页表、反置页表
- 基于RV,理解软硬件协同实现页式存储
- 了解当前的OS各部分的联系与交互
- 能描述虚拟内存、地址空间在概念和设计实现上的联系和差异
- 能从不同角度(应用、内核、CPU)理解地址空间
- 掌握不同的内存分配策略,并灵活应用
- 能灵活掌握基于某种硬件页机制,设计页表,并掌握虚拟地址到物理地址的转换过程
- 能够描述/分析 rt-v3::ch4的Address OS设计思路和实现的成效
- 能够完成 rt-v3::ch4的相关练习
- 能够完成实验二
- 虚拟存储的基本概念
- 局部性原理
- 覆盖和交换
- 虚拟页式存储
- RISC-V 缺页异常
- 页面置换算法的概念
- 局部页面置换算法
- 最优算法、先进先出算法和最近最久未使用算法
- 时钟置换算法和最不常用算法
- Belady现象和局部置换算法比较
- 全局页面置换算法
- 工作集置换算法
- 缺页率置换算法
- 理解虚拟存储的基本概念和目标
- 掌握如何结合Page Fault异常来设计实现虚拟存储
- 掌握各种局部页面置换算法和全局页面置换算法
- 理解Belady异常,以及Belady异常与页面置换算法的关系
- 掌握局部性原理
- 采用覆盖技术管理应用在有限内存上的内存配置
- 采用交互技术管理应用换入换出
- 理解虚拟存储在RV上如何实现,以及虚拟存储部分涉及到的OS基本运行过程
- 能够使用局部页面置换算法和全局页面置换算法来分析缺页次数等
- 掌握Page Fault异常出现后的软硬件协同处理过程
- 了解Copy on Write,Demanding Paging机制
- 灵活应用目前掌握的操作系统知识解决虚拟存储相关问题(功能、性能、安全性、便捷性等)
- 能够完成 rt-v3::ch4的相关练习
- 进程管理
- 单处理机调度
- 处理机调度概念
- 调度准则
- 调度算法
- 实时调度
- 实时任务
- 实时调度算法
- 优先级反置问题与解决方法
- 实验:进程管理
- 应用示例
- 进程的数据结构
- 进程管理机制的实现
- 理解进程管理的核心系统调用 fork, exec, exit, waitpid
- 理解进程管理的核心数据结构和大致处理过程
- 理解处理器调度各种调度算法
- 理解实时调度算法
- 理解优先级反转问题和相应的解决方法
- 了解当前的OS各部分的联系与交互
- 掌握进程管理的核心系统调用 fork, exec, waitpid, wait
- 能运用调度算法来分配处理器时间
- 灵活应用目前掌握的操作系统知识解决进程管理相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch5的Process OS设计思路和实现的成效
- 能够完成rt-v3::ch5的相关练习
- 能够完成实验三
- 对称多处理与多核架构
- 多处理器调度策略
- 多处理器调度机制
- O(1) 调度(option)
- CFS调度(option)
- BFS调度算法(option)
- 理解对称多处理与多核架构
- 理解操作系统如何管理对称多处理与多核架构
- 掌握多处理器调度与其中的负载迁移技术
- 理解多核架构对软件的影响(好的方面,不好的方面)
- 能运用多核调度算法来分配处理器时间
- 了解RV硬件的多核启动过程和软件初始化过程
- 文件系统概述
- 文件系统接口
- 文件系统实现(涉及 VFS)
- 实验:文件系统
- easyfs简介
- 块设备接口
- 块缓冲层
- 磁盘布局与管理
- 索引节点
- 在内核中接入easy-fs
- 实例:进程文件系统 procfs(option)
- 从不同的角度(应用、操作系统)理解文件系统
- 文件系统的核心系统调用
- 典型文件系统的设计实现
- 了解文件系统与OS其它部分的联系与交互
- 掌握文件系统的基本概念
- 掌握文件系统的内部机制和组成
- 能设计简单的文件系统
- 能够描述应用发出文件系统相关系统调用后OS的处理过程
- 灵活应用目前掌握的操作系统知识解决文件系统相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch6的Filesystem OS设计思路和实现的成效
- 能够完成rt-v3::ch6的相关练习
- 能够完成实验四
- 进程通信概念
- 信号
- 管道
- 消息队列
- 共享内存
- 实验:进程间通信与I/O重定向
- 标准I/O
- 管道
- 命令行参数与I/O重定向
- D-Bus机制(option)
- Binder机制(option)
- 理解进程--进程,进程--内核的通信机制和特点
- 理解不同IPC机制的特征和大致实现
- 掌握I/O重定向
- 了解IPC与OS其它部分的联系与交互
- 能描述不同IPC机制的大致实现
- 能设计管道机制
- 能描述I/O重定向的设计实现思路和运行过程
- 灵活应用目前掌握的操作系统知识解决IPC相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch7的IPC OS设计思路和实现的成效
- 能够完成rt-v3::ch7的相关练习
- 线程与协程
- 线程
- 用户线程、内核线程
- 协程
- 协程、线程与进程的关系
- 线程
- 实践:线程实现
- 理解进程、线程,协程的概念
- 理解进程、线程,协程的区别与联系
- 能够在用户态和内核态设计并实现线程管理
- 灵活应用目前掌握的操作系统知识解决线程管理相关问题(功能、性能、安全性、便捷性等)
- 能够完成rt-v3::ch8的相关练习
- 同步互斥基本概念
- 现实生活中的同步互斥问题
- 临界区
- 禁用硬件中断
- 基于软件的解决方法
- 更高级的抽象方法
- 信号量
- 管程、条件变量
- 同步互斥问题
- 哲学家就餐问题(信号量/管程)
- 读者-写者问题(信号量/管程)
- 死锁
- 死锁概念
- 死锁的必要条件
- 死锁处理方法
- 银行家算法
- 死锁检测
- 死锁概念
- 实践:并发与同步互斥
- 锁机制实现
- 信号量机制
- 条件变量机制
- 并发错误检测(option)
- 同步互斥-RCU(option)
- 理解同步互斥的基本概念
- 掌握各种同步互斥的操作手段
- 解决同步互斥问题
- 理解死锁概念
- 掌握各种死锁处理方法
- 理解各种死锁处理方法的局限性
- 了解当前的OS各部分的联系与交互
- 能够采用不同的同步互斥手段(基于软件的方法、信号量、条件变量、禁用中断等)灵活解决各种同步互斥问题
- 能应用银行家算法
- 掌握如何进行死锁检测
- 灵活应用目前掌握的操作系统知识解决同步互斥/死锁相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch8的SyncMutex OS设计思路和实现的成效
- 能够完成rt-v3::ch8的相关练习
- 能够完成实验五
- 设备概述
- 设备抽象
- 设备执行模型
- 实验:I/O设备管理
- 外设平台
- 串口驱动
- virtio设备驱动
- 理解设备的分类和特点
- 理解设备的各种抽象形式
- 理解设备执行模型(同步,异步....)
- 掌握设备驱动的设计与实现
- 掌握OS与外设的交互过程
- 了解当前的OS各部分的联系与交互
- 能描述OS与外设的交互过程
- 能编写应用程序来与设备进行交互
- 能编写简单的设备驱动程序(如uart等)
- 灵活应用目前掌握的操作系统知识解决设备相关问题(功能、性能、安全性、便捷性等)
- 能够完成rt-v3::ch9的相关练习
OPTION1:可靠文件系统主题:
- 系统可靠性概述
- 基于日志的文件系统
- 实际文件习题
- FAT文件系统(option)
- EXT4文件系统(option)
- NTFS(option)
- Zettabyte File System (ZFS)(option)
- 数据库文件系统(option)
- 做大实验的同学,基于2021秋季学期的基础实验在1个月内完成后,可选择继续大实验,否则与其他同学一起,完成2022春季实验。
覆盖:1/2/3章
知识点:计算机/OS启动、特权级切换、系统调用、应用程序/库/内核的关系、特权级相关异常、任务切换
- 显示目录文件名
- 实现一个Linux应用程序ls,能显示当前目录中的文件。
- 显示调用栈
- 实现一个linux应用程序,能打印出调用栈信息
- 显示目录信息
- 睡眠
- 实现一个rcore应用程序,用sleep系统调用睡眠一段时间(in rcore tutorial v3 Branch 2022spring)
- 显示调用栈
- 实现裸机程序,能打印调用栈
- 实现新系统调用get_taskinfo
- 增加get_taskinfo系统调用,能显示task的id和task name
- 统计系统调用
- 实现内核扩展,能够统计应用执行过程中系统调用编号和次数
- 统计时间
- 实现内核扩展,能够统计应用执行的完成时间
- 分析异常
- 统计执行异常的程序的异常情况说明(主要是各种特权级涉及的异常)
- 能够打印异常程序的调用栈
覆盖:4章
知识点:地址空间、应用与内核之间在不同地址空间的数据交互/控制交互、内存/地址相关异常(如缺页异常)
- linux应用访问内存相关系统调用
- 使用sbrk,mmap,munmap,mprotect系统调用
- 改进系统调用sys_get_time
- 引入虚存机制后,原来内核的 sys_get_time 函数实现就无效了。请你重写这个函数,恢复其正常功能。
- 实现新系统调用mmap, munmap
- 请实现 mmap 和 munmap 系统调用
- 实现新系统调用sbrk
- 请实现 sbrk系统调用
覆盖:5章
知识点:进程管理的关联性和必要性、调度算法
- 实现一个与进程管理相关的linux应用程序
- 能用nice,fork,exec,spawn等系统调用
- 实现新系统调用 spawn
- 实现一个调度算法-如:stride
覆盖:6,7章
知识点:文件系统的实现、进程间通信机制
- 实现一个应用程序能体现文件/进程间通信的特点
- 扩展文件系统功能
- 扩大单个文件的大小
- 支持三重间接inode
- 扩展mmap系统调用,支持对文件的映射
- 这样对内存读写,其实就是对文件读写
- 支持crash一致性(hard)
- 扩展log fs
- 扩大单个文件的大小
- 实现一个文件相关系统调用相关
- 实现硬链接相关系统调用
- 实现创建目录的系统调用
- 实现一个新的重定向能力
- 实现共享内存
覆盖:8章
知识点:线程,同步互斥的机制,解决同步互斥问题,死锁,优先级反转问题。
- 实现一个Linux线程应用程序能体现线程属性和线程间同步互斥的特点
- 使用了pthread_* 系统调用
- 扩展内核功能:内核线程
- 在内核中支持内核线程
- 在内核线程中支持同步互斥机制
- 实现内核线程用的mutex, semaphore, cond-var
- 扩展内核功能:多核支持
- 扩展rcore-tutorial-v3运行在多核系统中
- 用银行家算法解决死锁问题
- 设计某种资源申请导致死锁的例子
- 设计银行家算法来避免死锁问题
- 解决优先级反转问题
- 实现RM实时调度算法
- 设计优先级反转的实例
- 实现优先级天花板和优先级继承方法
(一个月完成实验1~5后,可选择完成扩展实验来代替考试)
实现新feature的支持(游戏等)
涉及:参加比赛、支持多核、支持设备驱动、支持树莓派/SiFive等(与老师协商)