Operating System Principles And Implementation

操作系统原理与实现
陈香兰
Spring 2017


课程基本信息


  1. 必修
  2. 课时:2课时/次*2次/周*15周=60课时
  3. 机时:40;
SundayMondayTuesdayWednesdayThursdayFridaySaturday
Time slots 3-4
Time slots 6-7

主讲老师信息


陈香兰(xlanchen@ustc.edu.cn)
  • 课程QQ群:559786684(请提供验证信息“OS_student:你的学号_你的姓名”)。
    入群后请修改昵称为“你的学号_你的姓名”

助教信息


  • 人数(3人)
  • PB14011丛晓宇(cxy00@mail.ustc.edu.cn)
  • PB14011冯彬(fengbin1@mail.ustc.edu.cn)
  • SA15011王震(wzzju@mail.ustc.edu.cn)

  • 教材


    使用“恐龙书”,即《Operating System Concepts》
    1. 教材主页:http://www.os-book.com/
    2. 教材信息:英文原版的最新版为第9版,目前国内有第7版的影印版和翻译版。
    http://codex.cs.yale.edu/avi/os-book/images/os9c-cover.jpg http://ecx.images-amazon.com/images/I/51Jq1Aw1fiL._AA200_.jpg http://images.china-pub.com/ebook50001-55000/54793/zcover.jpg

    其他参考书


    Understanding the linux kernel

    Slides


    0. 课程简介
    1. 第一章 2. 第二章 3. 第三章 4. 第五章 5. 第四章 6. 第六章 7. 第七章 8. 第八章 9. 第九章 10. 第十章 11. 第十一章 12. 第十二章 13. 第十三章

    交作业通知


    第一次交作业的时间:2017年3月1日。截止时间为2017年3月1日晚9点之前,以交到助教手上的时间为准。不接受迟交的作业。
    第二次交作业的时间:2017年3月15日。截止时间为2017年3月15日晚9点之前,以交到助教手上的时间为准。不接受迟交的作业。
    第三次交作业的时间:2017年3月29日。截止时间为2017年3月29日晚9点之前,以交到助教手上的时间为准。不接受迟交的作业。
    第四次交作业的时间:2017年4月12日。截止时间为2017年4月12日晚9点之前,以交到助教手上的时间为准。不接受迟交的作业。
    第五次交作业的时间:2017年4月26日。截止时间为2017年4月26日晚9点之前,以交到助教手上的时间为准。不接受迟交的作业。
    第六次交作业的时间:2017年5月10日。截止时间为2017年5月10日晚9点之前,以交到助教手上的时间为准。不接受迟交的作业。
    第七次交作业的时间:2017年5月24日。截止时间为2017年5月24日晚9点之前,以交到助教手上的时间为准。不接受迟交的作业。

    上机实验(上机时间:待定;地点:待定)


    上机实验的公共要求


  • 提交一个压缩文件,压缩文件包括:演示+书面报告(电子)+ppt(可以放映,有旁白)
  • 演示要求录制视频, 视频元素包括:演示内容、作者、语言说明
  • 提交实验压缩文件的时间以包含该文件的邮件发送时间为准

  • 实验1[实验报告截止时间:待定]


    1、【全体适用】在虚拟机(VirtualBox)上安装一款Linux发行版操作系统(推荐KUbuntu)
  • 注意:使用虚拟机不是必须的。可以直接在裸机上安装。也可以使用wubi安装。
  • 熟悉Linux下的软件安装方法
  • 安装一个可用的集成开发环境(推荐:eclipse CDT)和GCC编译工具链(大多自带)
  • 学会编写简单的shell脚本
  • 注意:为防止数据因重装系统丢失,建议将数据与系统分开管理
  • 完成时间:由助教指定
  • 2、【早就安装过Linux,平时工作在Linux平台上,并且不想再次安装Linux的同学适用】
  • 截图并说明你的Linux平台,包括版本信息等内容
  • 查看你的MBR内容,并截图说明
  • 截图并说明你的Linux平台上的集成开发环境或者你的喜欢使用的(其他/非集成)开发环境界面
  • 提供一个你自己编写的shell脚本,脚本中提供使用手册说明脚本编写的目的和使用方法
  • 提供一个你自己编写的C语言程序,附README文件说明编写此程序的目的和编译及运行方法
  • 完成时间:同1
  • 3、【要求】
  • 1人1组
  • 检查方法和要求:提交详细的安装说明书,要求列出遇到的困难和解决的方法
  • 截止时间:以助教给定的时间为准
  • 实验2:制作启动硬盘并启动一个操作系统映像[实验报告截止时间:待定]


  • 下载grub-0.97.tar.gz并编译,或者直接下载grub-0.97-i386-pc.tar.gz(这是已经编译好的)
  • 制作grub启动软盘,进而制作启动硬盘
  • 操作系统映像:可以到网络上下载一个可用的OS映像,然后编写menu.lst或grub.cfg,利用grub启动之
    • 例如dlxlinux,或其他
    • 这里提供2个RTEMS操作系统的映像: hello.exe ticker.exe
    • 也可以自己编译一个Linux内核、制作一个根文件系统,并启动之
  • 可以参考 这里
  • 提交实验报告
  • 完成时间:由助教指定
  • 实验3:实模式下的HelloWorld[实验报告截止时间:待定]


  • 实验内容:
    1. 编写一段16进制的汇编程序,用作启动扇区代码
    2. 编写一个链接脚本,将启动代码按照启动扇区进行链接
    3. 制作启动软盘,将启动扇区代码安装到软盘的启动扇区(也可以选择其他介质)
    4. 启动运行启动扇区代码,最后进入死循环
    5. 编写一个shell脚本文件,将make,制作启动软盘,启动运行等步骤放在这个脚本文件中
  • 代码的大致流程如下:关中断;初始化必要的寄存器(段寄存器和栈针);清屏;输出携带学号和姓名拼音信息的helloworld字符串;死循环结束。
  • 参考这个文件
  • 汇编语言参考1:x86 Assembly Programming,有关于AT&T汇编的说明;
  • 汇编语言参考2:80x86指令说明,这里面用的是Intel汇编格式
  • 实验报告内容
    1. 什么是BIOS?BIOS和启动软盘之间的启动协议是什么?
    2. 启动时为什么要关中断
    3. 什么是实模式?实模式初始化哪些寄存器?
    4. VGA的接口是什么,如何编程实现VGA输出
    5. 什么是链接脚本?启动软盘的链接脚本有哪些注意的地方?
    6. 从Power-on开始,说清楚计算机是如何一步一步启动,直到开始运行你写的代码
    7. 给出代码运行关键时刻的截屏并加以说明
  • 打包提交源代码
  • 完成时间:由助教指定
  • 实验4:从实模式进入保护模式[实验报告截止时间:待定]


  • 实验内容:
    1. 对实验3中的汇编程序进行增量编程,仍用作启动扇区代码
    2. 链接脚本不变,shell脚本根据需要修改,仍制作启动软盘,将启动扇区代码安装到软盘的启动扇区(也可以选择其他介质)
    3. 启动运行启动扇区代码,最后进入死循环
  • 代码的大致流程如下:在实验1输出携带学号和姓名拼音信息的helloworld字符串后,显示输入任意按键,接获任意按键后,显示开始进入保护模式,进入保护模式,显示OK,回车,显示已经进入保护模式;死循环结束。
  • 参考这个文件
  • 实验报告内容
    1. 如何在实模式下利用BIOS实现任意键的获取?
    2. 什么是保护模式?要进入保护模式需要进行哪些准备?
    3. 【附加】如何在是模式下利用BIOS实现VGA显示?能不能在保护模式下利用BIOS实现IO?能或者不能都说出你的理由。
    4. 保护模式下写VGA缓存和实模式下写VGA缓存有什么不一样?
    5. 你是如何实现回车功能的?
    6. 给出代码运行关键时刻的截屏并加以说明
    7. 给出你所有代码的流程图
  • 打包提交源代码
  • 完成时间:由助教指定
  • 实验5:加载操作系统映像并进入C语言编写的main函数[实验报告截止时间:待定]


  • 实验内容:
    1. 学习制作简单的makefile
    2. 学习制作一个简单的操作系统映像
    3. 学习从启动代码转入操作系统代码运行
    4. 为C函数的运行做好适当的准备
    5. 文件清单:start16.S, start32.S, main.c, start16.ld, myOS.ld, makefile, source2img.sh
  • start16.S的大致流程如下:在实验2进入保护模式前,先从软盘加载操作系统映像到物理地址0X7E00开始的物理内存中;不进入实验2最后的死循环,转而执行start32.S中的代码。
  • start32.S的大致流程如下:初始化栈;清空BSS;调用C语言编写的main函数
  • main.C的main函数大致流程如下:清屏;输出helloworld
  • 参考这个文件
  • 实验报告内容
    1. make工具的作用是什么?在命令行上输入“make OS”的含义是什么?Makefile中规则的语法是什么?
    2. 何时加载操作系统映像合适?加载多少个扇区合适
    3. 如何利用BIOS软盘驱动加载操作系统映像?
    4. 从汇编进入C需要做哪些准备?栈在什么位置比较合适?什么是BSS段?BSS段清0有什么好处
    5. 使用C语言编写写VGA缓存和汇编写VGA缓存有什么不一样?附加问题:你能不能从C语言中调用汇编写的VGA输出函数?你能不能从汇编调用C写的VGA输出函数?说出你的方法。
    6. 给出代码运行关键时刻的截屏并加以说明
    7. 给出你所有代码的流程图
    8. 说明你打包提交的源代码中的文件清单,要说清每个文件的作用
    9. 附加问题:如果你的main函数最后不是死循环,请说明main函数返回后你的操作系统在执行什么?
  • 打包提交源代码
  • 完成时间:由助教指定
  • 实验6:实现任务数据结构实现创建和销毁原语,实现上下文切换[实验报告截止时间:待定]


  • 实验内容:
    1. 设计任务数据结构,命名为myTCB
    2. 实现任务创建原语(接口命名为createTsk())和销毁原语(接口命名为destroyTsk())功能
    3. 实现任务上下文切换(接口命名为CTX_SW())功能
    4. 实现FCFS调度算法,调度接口命名为schedule()
    5. 实现简单的就绪队列和入列/出列原语
    6. 实现任务启动原语,接口命名为tskStart()
    7. 实现任务终止原语,接口命名为tskEnd()
    8. 创建idle任务,idle任务的主体是一个死循环,在循环体中,调用schedule
    9. 创建init任务,init任务的主体(接口命名为initTskBody())由测试用例提供。
    10. 实现osStart原语
    11. 测试用例[老师提供userApp目录]:创建一组任务,这组任务按照FCFS的方式先后运行并输出相关信息。
    12. 必须提供的接口说明参见QQ群中文件“6-README-2017-task-fcfs”
    13. 老师提供userApp目录参见QQ群中压缩文件“6_userApp.rar”
  • 提示(非强制要求):
    1. 不考虑抢占。
    2. 按照FCFS的方式组织就绪队列。
    3. 在任务创建原语的最后,若创建成功直接调用tskStart()。
    4. 在任务终止原语中,任务从就绪队列中出列,并调用销毁原语,最后调用调度接口(有bug)。
    5. 上下文切换原语的要求是:支持本实验的正确运行
    6. osStart完成idle、init的创建之后,调用上下文切换原语或者schedule完成控制权的第一次转移,进入多任务运行
  • 实验报告内容
    1. 提供设计报告、测试计划和测试报告
    2. 要求1:设计报告中提供每个数据结构和原语的接口说明、设计说明,给出原语流程
    3. 要求2:测试报告中给出测试内容和测试计划,测试用例的设计、测试运行情况和测试结果分析
  • 打包提交源代码
  • 完成时间:由助教指定
  • 实验7:内存管理算法[实验报告截止时间:待定]


  • 实验内容:
    1. 检测物理内存:实现内存有效性检查方案以检查你所管理的动态内存。
      • 为简单起见,允许直接从1MB开始。
      • 接口:pMemStart(?=1MB)和pMemSize。
      • 操作系统初始化过程中进行检查,并汇报pMemStart和pMemSize的值(要求16进制表示)
      • 附加(非强制要求):从0地址开始。
    2. 实现动态分区算法:dPartition
      • 给定任意大小的内存区域,按照动态分区算法对其进行初始化。接口:dPartitionInit()。(要求:若内存区域太小,小于最小大小,进行失败提示)
      • 从动态分区中分配一个指定大小的分区(允许进行4字节、8字节或你自定义的某个大小对齐)。接口:dPartitionAlloc()
      • 释放一个分区。接口:dPartitionFree()
      • 将检测到的动态物理内存,按照动态分区的方式进行管理
      • 重新封装动态物理内存的分配和回收接口,提供malloc和free接口给userApp。
    3. 实现等大小固定分区算法:eFPartition
      • 给定分区大小和分区个数,结合你的内部管理数据结构开销,计算出总大小。接口:eFPartitionTotalSize()
      • 将给定内存区域初始化为若干个等大小固定分区。初始化接口:eFPartitionInit()
      • 分配一个固定大小分区。接口:eFPartitionAlloc()
      • 释放一个固定大小分区。接口:eFPartitionFree()
      • 修改你的任务池分配算法:从动态物理内存中,分配一个动态分区,该动态分区能容纳指定个数的任务和内部数据管理开销,使用等大小固定分区算法管理这个动态分区。
    4. 修改osStart原语,以增加内存管理功能
    5. 测试用例[老师提供userApp目录]:创建一组任务,这组任务按照FCFS的方式先后运行,运行过程中进行内存管理测试并输出相关信息。
    6. 必须提供的接口说明参见QQ群中文件“7-README-2017-mem”[待提供]
    7. 老师提供userApp目录参见QQ群中压缩文件“7_userApp.rar”[待提供]
  • 实验报告内容
    1. 说明你的内存有效性检查方案,提供参考文献
    2. 说明你的动态分区算法和等大小固定分区算法
    3. 要求1:设计报告中提供每个数据结构和原语的接口说明、设计说明,给出原语流程
    4. 要求2:测试报告中给出测试内容和测试计划,测试用例的设计、测试运行情况和测试结果分析
  • 打包提交源代码
  • 完成时间:由助教指定
  • 实验8:实现时间片轮转调度算法[实验报告截止时间:待定][待调整]


  • 实验内容:
    1. 实现中断初始化和中断管理,提供缺省中断处理入口
    2. 实现开中断和关中断,接口enbleIRQ()、disableIRQ()
    3. 实现时钟初始化和时钟中断
    4. 实现时间片轮转调度算法
    5. 修改osStart原语,以增加相关功能的初始化
    6. 测试用例[老师提供userApp目录]:创建一组运行时间较长的任务,这组任务按照时间片轮转的方式运行,运行过程中输出相关信息(要求能展现时间片轮转的效果)。
    7. 必须提供的接口说明参见QQ群中文件“8-README-2017-task-RR”[待提供]
    8. 老师提供userApp目录参见QQ群中压缩文件“8_userApp.rar”[待提供]
  • 提示:开中断后,注意临界区的保护。可以使用关中断保护
  • 实验报告内容
    1. 提供设计报告、测试计划和测试报告
    2. 要求1:设计报告中提供每个数据结构和原语的接口说明、设计说明,给出原语流程
    3. 要求2:测试报告中给出测试内容和测试计划,测试用例的设计、测试运行情况和测试结果分析
  • 打包提交源代码
  • 完成时间:由助教指定

  • Edited by xlanchen@ustc.edu.cn
    HeFei, AnHui, China.
    Spring, 2017.