【操统实验】原型操作系统进化(无限断更)

传说中的,鸭大计科鬼门关

  这个东西大概是分成 14 个实验项目,可以从零开始写一个自己的操作系统。
  当然,是个古老的操作系统,实模式、使用 1.44MB 软驱、1 MB 内存,用虚拟机跑。开一个 82 年的操作系统压压惊.jpg

  然后如果每一个项目都完整记下来的话博客就太长了。正好本来就要写实验报告,实验报告是很完整的,那就把每次的实验报告和源码都 po 出来,把每一个实验报告连起来就是完整的教程+历程了。
  点我下载
  (似乎 git 打不开 pdf?那就放个百度网盘链接,提取码:0gl6

  然后这里就只是简单写写每一个实验的重点和对实验报告的补充了。

  以及参考资料真的很难找,百度找别人博客真的很难找到靠谱的。所以建议看我的以及我所引用的

  推荐书:《x86汇编语言 从实模式到保护模式》《深入理解计算机系统》《一个64位操作系统的设计与实现》

实验一:裸机控制与扇区引导程序设计

  关键词:汇编 x86、软盘分扇区及其格式、引导程序、配置虚拟机

  首先要懂什么是计算机启动,简单来说就是 1、通电;2、指令地址初始化给 BIOS 对硬件做检查;3、检查完之后找存储设备加载引导程序;4、引导程序引导系统启动。
  然后了解一下古老的 1.44MB 软盘是怎样的格式,一般来说是分 2880 个扇区,每个扇区 512 字节。扇区有格式的(参考 FAT12 文件系统),首扇区有 448 字节是放引导程序的。实验一的任务就是写这个。
  开机自检完后,BIOS 会把存储设备首扇区加载到内存 0x7c00 的位置,一般首扇区的第一句话是一个跳转指令,跳到引导程序的位置,然后就开始了。(不想搞这么复杂的话,也可以首扇区从第一句话开始就是引导程序,计算机都只是在执行指令而已)

  引导程序其实没什么,你就随便写点东西(比如往显存里(内存起始地址 0xB800:0x0000)写些字符),然后用 0 填够 512 字节,再把最后两个字节改成 0x55aa(这个是合法首扇区的标志),这就可以直接作为一个 512 字节的存储设备拿去开机了。
  这个搞通以后就是把这个“往显存里写东西”搞花哨些,纯粹是个程设练习。

  我感觉最大的操作就是配置各种环境,包括虚拟机、十六进制编辑器、汇编器。
  要善用十六进制编辑器去看看 .img 文件里到底是些什么东西。

实验二:加载执行COM格式用户程序的监控程序

  关键词:单道批处理系统、监控程序、BIOS 中断、COM 格式

  意思就是说把引导程序换成一个监控程序,它能执行用户程序,执行完后返回来,继续执行下一个用户程序。这是最原始的操作系统。
  (此处假设用户程序是能正常执行完毕的,不会死循环的)
  最主要思考的问题就是,监控程序如何去到用户程序,完了以后又怎么回来。(UPD:标准的实现在实验五完成了)
  最主要学的是 BIOS 中断服务,这个就是最底层的硬件调用了。

实验三:C与汇编开发独立批处理的内核

  关键词:C 与汇编混合编程、内核与引导程序分离

  这次实验就是用 C 与汇编混合编程的方式重写上次的监控程序,使其能够更加方便地拓展功能。然后把这个东西与首扇区引导程序分离,成为独立内核(引导程序只有400多字节肯定是塞不下操作系统的)。
  重中之重就是学会用 C 和汇编混合编程。这里使用中间文件链接的方式,即两种语言各生成中间文件,然后链接起来。(C内嵌汇编也很资瓷啊)
  烦中之烦是配置环境和工具。不是随便找些 C 编译器、汇编器、链接器都能组合在一起用的,必须找到恰当的组合才能跑起来!!!(鸭大童鞋们做到这里应该能理解 lyb 为什么每节课都要强调这个问题了 qaq 有些痛要经历了才能理解别人的啰嗦)
  难点是 C 和汇编互相调用对方的变量、函数、过程,这里有很多格式要求、默认规则。

  关于实模式和保护模式,一开始这套操作系统的定位是 16 位实模式的,然而 gcc 实际上并不能编译出 16 位程序,只能用 32 位的寄存器、指令、栈对齐,而使用实模式寻址方式,即“用 32 位模拟 16 位”。这其实是比较尴尬的搭配,但我不想搞那么多事情所以也就这样凑合了。

  资料真的真的很难找,有条件还是把《x86汇编语言 从实模式到保护模式》《深入理解计算机系统》《程序员的自我修养:链接、装载与库》之类的大部头好好读一读吧,在百度上瞎找真的不靠谱。起码也要谷歌,或者读我的实验报告(x

实验四:中断处理与异步事件响应

  关键词:中断处理、中断向量

  这次是彻底搞明白中断的原理,并且自己写一些中断处理程序。用系统时钟中断写一个“-\\ |/”循环输出的“无敌风火轮”,用键盘中断写一个在用户程序执行期间按键盘会显示“OUCH!OUCH!”的功能。
  这次简单很多了,读《x86》第九章读完就都会做了。

实验五:系统调用

  关键词:系统中断服务、系统调用,库

  这次实验在技术上没有新东西,就是用中断处理来实现一组基本的系统调用(我其实只做了基础 IO),然后制作相应的库文件,这样用户就能基于这个操作系统来编程了。
  算是把操作系统的一些功能服务给标准化、完善化了。

  一些规范:中断处理前后的现场保护及恢复、栈的管理,以及用户程序加载跳转及返回,现在终于正规了——用户程序 PSP 处埋一条 int 20h,初始化用户栈之后 push 0,jmp 到用户程序,用户程序结束后 ret 到开头 PSP,执行 int 20h 返回操作系统。

  这次实现的 int 08h 的现场保护及恢复、CPU 上下文 struct 等东西,可以为接下来的多进程做铺垫了。

实验六:时间片轮转的二态进程模型

  关键词:多进程、二状态进程模型

  终于多进程了!!这次实验是分水岭,在此之前叫做基础实验,在此之后叫做拓展实验(可以不按顺序做
  众所周知,单核的多进程其实就是轮流执行所有进程,使其看起来像是同时执行一样。用系统时钟中断来触发进程切换,因此叫做“时间片轮转”。而“二态”,就是指进程只有 running 和 ready 两种状态。
  其实就是在上一次的实验基础上,增加一些进程管理用的数据结构,增加进程调度过程,修改现场保护及恢复,以及其他相关改动。
  最后用之前实验的 4 个射字母的程序作为测试,如果屏幕的四个区域同时射字母,就表示成功了。

实验七:五状态进程模型及多线程

  咕

实验八:信号量机制与应用

  咕

实验九:FAT12文件系统引导和加载

  关键词:FAT12 文件系统、FAT 表、根目录项

  一改以往无格式存储的混沌状态,向专业的文件系统迈进!
  就是现在要对软盘的存储进行规范化了。有很多种规范,比如现在一般用 FAT32,我们这个古董操作系统就用 FAT12。
  它的基本思想就是,一个文件如果分为多个簇(一簇=一个扇区)储存,那么就用一个链表来把这些簇号记下来。FAT 表就是用来干这个事的,FAT 表每一项对应一个簇,其值为“下一簇是谁”,这样就形成了链表。一个文件的首簇号连同该文件其他信息,一起记录到根目录表中,一个文件信息 32 字节。
  FAT 表的一个表项是 1.5 字节,因此“查询某一指定表项”就是本次实验的难点,需要精细的位运算。
  那只有根目录表,怎么实现多级目录呢?——把子目录做成一个文件,这个文件的内容就是子目录里的文件信息,同样是 32 字节一个!!

  据说实现了文件系统之后,用 WinImage 之类的东西可以实现“把一个文件直接拖到一个映像盘里”。这是何等的方便啊!可是学期结束了已经没有下次了哈哈哈哈哈哈哈哈哈哈哈

后续实验

  学期结束了,老师不发文档,带头咕了