操作系统期末总结文档和考试卷解析

这篇博客由黑龙江大学金虎老师授课,分享了操作系统课程的期末总结文档和考试卷解析。实验代码因未完整实现而上传至百度云盘,供有需要的同学参考。博主还附上了读书报告和实验总结报告的文字版,但建议下载云盘文件以获取完整理解。博主指出读书报告部分较为理论,未实际编写操作系统。考试内容虽简单,博主个人得分89,但卷面分数较高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任课老师为黑龙江大学金虎


实验的源代码较多,但是由于未完整实现一个功能,也不好上传到github上,我就直接上传到百度云盘了,可能之后有一些黑大的学生搜索参考的时候要用到。


百度云盘地址:http://pan.baidu.com/s/1jGoxW0Y


贴一下读书报告和实验总结报告吧,这样版面也不会太空,贴出来的2份报告只有文字没有图,所以可能理解会有一些问题,真有需要的同学请下载云盘里的文件。

说实话读书报告这个东西有点虚,我并没有实际的跟着《自己动手写操作系统》这本书去真正写一个操作系统,只是了解了其中的一些知识。

 

 “操作系统课程设计”读书报告


黑龙江大学计算机科学技术学院 软件学院
 
一、基本理论阐述
理论要结合实际
——如何真正写一个操作系统
虽说万事开头难.但有时也未必。比如说,写一个有实用价值的操作系统是一项艰巨的工作。但一个小的操作系统或许很容易实现了。现在我们就来实现一个小得无法再小的“操作系统”。建议你跟随书中的介绍一起动手来做。你会发现不但很容易,而且很有趣。
1.1	准备工作
我们需要准备:
1.	硬件
一台计算机(windows操作系统)
一张空白软盘
2.	软件
汇编编译器 NASM
软盘绝对扇区读写工具,比如FlooppyWriter.exe

注意:这个方法显然已经不能再现在使用了,现在的我甚至找不到一张软盘。所以这个结合实际是指了解一个底层的能直接运行的操作系统应该是怎么诞生的。
1.2 10分钟完成的操作系统
	你相不相信,一个“操作系统”可以只有20行代码?请看:
	ORG 07C00H		;告诉编译器程序加载到了7C00处
	MOV AX,CS
	MOV DS,AX
	MOV ES,AX
	CALL DISPSTR		;调用显示字符串例程
	JMP $			;无限循环
DISPSTR:
	MOV AX,BOOTMESSAGE
	MOV BP,AX		;ES:BP = 长度
	MOV CX,16		;CX = 串长度
	MOV AX,01301H	;AH = 13,AL = 01H
	MOV BX,000CH		;页号为0(BH = 0)黑底红字(BL = 0CH,高亮)
	MOV DL,0
	INT 10H			;10H号中断
	RET
BOOTMESSAGE:		DB	“HUORAN,I LOVE U --HELLOCLYDE”
TIMES	510-($-$$)	DB	0	;填充剩下的空间,使生成的二进制代码
;恰好为512字节
DW		0XAA55				;结束标志


把这段代码用NASM编译一下:
NASM BOOT.ASM –O BOOT.BIN
我们就得到了一个512B的boot.bin,使用软盘绝对扇区读写工具将这个文件写到一张空白软盘的第一个扇区。好了,你的第一个“操作系统”就已经完成了。这张软盘已经是一张引导盘了。
把它放到软驱中重新启动计算机,从软盘引导,就能看到操作系统的模样了。

1.2	Boot Sector
实际上,你刚刚所完成的并不是一个完整的OS,而仅仅是一个最最简单的引导扇区(Boot Sector),然而不管我们完成的是什么,至少,它是直接在裸机上运行的,不依赖于任何其他软件,所以,这和我们平时所编写的应用软件有本质的区别。它不是操作系统,但是已经具备了操作系统的一个特性。
	当计算机电源被打开时,它会先进行加电自检(POST),然后寻找启动盘,如果是选择从软盘启动,计算机就会检查软盘的0面0磁道1扇区,如果发现它以0xAA55(假如我们把此扇区看作一个字符数组sector[]的话,那么此结束标志相当于sector[510] = 0x55,且sector[511]=0xAA)结束,则BIOS认为它是一个引导扇区,也就是我们说的Boot Sector。当然,一个正确的Boot Sector除了以0xAA55结束之外,还应该包含一段少于512B的执行码。
	好了,一旦BIOS发现了Boot Sector,就会将这512B的内容装载到内存的0000:7c00处,然后跳转到0000:7c00处将控制权彻底交给这段引导代码。到此为止,计算机不再由BIOS中的固有的程序来控制,而变成由操作系统的一部分来控制。
	现在,你可能明白了为什么在那段代码的第一行会出现org 07c00这样的代码,没错,这行代码就是告诉编译器,将来我们的这段程序要被加载到内存偏移地址7c00处。
1.3	代码解释
其实程序的主体框架只有5行(从第2行到第6行),其中调用了一个显示字符串的子程序。程序的第2、3、4行是3个mov指令,使ds和es两个段寄存器指向与cs相同的段,以便在以后进行数据操作的时候能定位到正确的位置,第5行调用子程序显示字符串,然后jmp $让程序无限循环下去。
	可能大部分人开始学汇编时用的都是MASM,其实NASM的格式跟MASM总体上是差不多的。
	我们学校练习汇编就是使用MASM。
在这段程序中,值得说明的地方有以下几点:
1.	在NASM中,任何不被方括号[]括起来的标签或者变量名都被认为是地址,访问标签中的内容必须使用[],所以,
mov ax,BootMessage
		将会把“HuoRan,I love U --HelloClyde”这个字符串的首地址传给寄存器ax。又比如,如果有:
			FOO DW 1
		则mov ax,foo 将把foo的地址传给ax,而mov bx,[foo]将把bx的值赋为1。
			实际上,在NASM中,变量和标签是一样的,也就是说:
			FOO DW 1 = FOO : DW 1
			而且你会发现,Offset这个关键字在NASM也是不需要的。因为不加方括号时表示的就是Offset。
			笔者认为这是NASM的一大优势,要地址就不方括号,也不必额外地用什么Offset,想要访问地址中的内容就必须加上方括号。代码规则非常鲜明,一目了然。
2.	关于$和$$,$表示当前行被汇编后的地址。这好像不太好理解,不要紧,我们把刚刚生成的二进制代码文件反汇编来看看:
NDISAAMW –O 0X7C00 BOOT.BIN >> DISBOOT.ASM
打开disboot.asm,你会发现这样一行:
00007C09	EBFE	JMP SHORT 0X7C09
其实我觉得这很好理解,根本不用举例,让我打了这么多字,一个没看过汇编和编译原理的人怎么会来看操作系统的相关书。
那么$$表示什么呢?它表示一个节的开始处被汇编后的地址。实例程序已有一个节,所以$$就表示程序开头0x7c00。
这里的section属于NASM规范的一部分,表示一段代码,关于它和$$更详细的注释请参考NASM联机技术文档。
在写程序的过程中,$-$$可能会被经常用到,它表示本行距离程序开始处的相对距离。现在,你应该明白510-($-$$)表示什么意思了吧?times 510-($-$$) db 0表示将0这个字节重复510-($-$$)遍,就是在剩下的空间中不停地填充0,知道程序有510B为止。
这样,加上结束标志0xAA55占用的2B,恰好就是512B。
1.4	水面下的冰山
即便是非常袖珍的程序,也有可能遇到不能正确运行的情况,对此你一定并不惊讶,谁都可能少写一个标点,或者在一个小小的逻辑问题上犯迷糊。好在我们可以调试,通过调试,可以发现错误,让程序日趋完美。但是对于操作系统这样的特殊程序,我们没有办法用普通的调试工具来调试。可是,哪怕一个小小的Boot Sector,我们也没有十足的把握一次就写好,那么遇到不能正确运行的时候该怎么办呢?在屏幕上没有看到我们所要的东西,甚至于机器一下子重启了,你该如何是好呢?
	每一个问题都是一把锁,你要相信,世界上一定存在一把钥匙可以打开这把锁。你也一定能找到这把钥匙。
	一个引导扇区代码可能只有20行,如果Copy&Paste的话,10秒钟就搞定了,即使自己敲键盘抄一遍下来,也用不了10分钟。
	复制粘贴的话,哪怕一万行的代码也不用10秒钟。
	可是,在遇到一个问题时,如果不小心犯了小错,自己到运行时才发现,你可能不得不花费10个10分钟设置更长的时间来解决它。笔者把这20行的程序称作水面以上的冰山,而把你花了数小时的时间做的工作称作水面下的冰山。
	这点,深有体会。作为一个程序员有2大难题,一个是解决思路,一个就是调试问题。特别是当调试工具不够完善的时候,往往要花费大量的时间去调试,面对特殊的数据结构或者资源,往往还要自己写工具去帮助调试。
		古人云:“授之以渔不如授之以渔。”下面都是笔者经历了一些痛苦的摸索之后的一些心得,这些方法可能不是最好的,但至少可以给你提供一个参考。
		好了,以Boot Sector为例,你可以想象的到,将来我们一定会对这20行进行扩充,最后得到200行甚至更多的代码,我们总得想一个办法,让它调试起来容易一些。其实很容易,我们只要把“org 07c00h”这一行改成“org 0100h”就可以编译成一个.com文件让它在DOS下运行了。我们来试一试,首先把07c00h改成0100h,编译:
		NASM BOOT.ASM –O BOOT.COM
		好了,一个易于执行和调试的Boot Sector就制作完毕了。调试.com文件可能让你仿佛一下子回到了20世纪,没关系,怀旧一下感觉还是蛮不错的。
		Turbo Debugger是一个不错的调试工具,“图形化”界面&#
专业方向:软件工程-软件工程(ID:07701) 修订人:金虎 ________________________________________ 《操作系统大作业》教学大纲 第一部分 课程目的与任务 一、课程基础: 在学这门课之前,学生必须预修过高级语言、数据结构、离散数学方面的基本知识,先修操作系统课程,延时完成操作系统大作业。 二、适应对象: 计算机科学与技术-计算机应用; 软件工程-软件工程; 电子信息科学类-电子信息科学与技术;管理类-信息管理专业 三、教学目的: 为配合《操作系统》课程的教学,过模拟操作系统原理的实现,使学生能更深刻地领会操作系统工作原理操作系统实现方法,并提高程序设计能力, 特开设此课程设计。 四、内容提要: 本课要求模拟采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理文件管理四部分。 第二部分 内容及基本要求 第1章、进程控制管理实现 ●基本要求:利用简单的结构控制方法模拟进程结构、进程状态进程控制。 ●参考学时:8学时 ●参考资料: 用PCB表示整个进程实体,利用随机数方法或键盘控制方法模拟进程执行中产生的事件。或者利用鼠标或者键盘中断的基于图形接口方式的进程控制管理。 1、 定义PCB(可以采用静态结构或动态结构):包括理论PCB中的基本内容,如内部ID、外部ID、进程状态、队列指针。由于无法实现真正的进程创建功能,在实验中只需建立PCB,用它代表完整的进程。 2、 定义进程状态转换方式:进程的状态转换是由进程内部操作或操作系统的控制引起,由于无法实现这些功能,学生可以采用随机数方法或键盘控制方法模拟,并实现对应的控制程序。随机方法指产生1-6的随机数,分别代表创建进程(c)、结束进程(e)、进程阻塞(b)、激活进程(w)、调度进程(p)、时间片到(t)等事件;键盘模拟方法指定义6种按键代表以上6种事件。 3、 根据四种事件处理就绪队列、阻塞队列当前执行中的进程。 每次事件处理后应形象地显示出当前系统中的执行进程是哪一个,就绪队列阻塞队列分别包含哪些进程。 第2章、请求分页式存储管理的地址转换过程实现: ●基本要求:实现分页式存储地址转换过程,在此基础上实现请求分页的地址转换。实现请求页式地址转换中出现的缺页现象时,用到的先进先出FIFO、最近最久未使用LRU、最佳OPT置换算法。 ●参考学时:8学时 ●参考资料: 利用键盘输入本模拟系统的物理块的大小,作业的页表中的块号;完成逻辑地址转换成相应的物理地址的过程。 1、建立一张位示图,用来模拟内存的分配情况,利用随机数产生一组01的数对应内存的使用情况。 2、输入块(页)的大小,过模拟位示图为本作业分配内存空间建立相应的页表(长度不定); 3、录入逻辑地址转换成相应的物理地址 4、扩充页表,变成请求式的二维页表(增加存在位等)完成地址转换。 5、输入分配给本作业的块数,模拟作业执行的逻辑地址转换成页面调度次序; 6、分别采用OPT、FIFO、LRU置换算法,利用堆栈结构完成页面置换;记录被换出的页面新换入的页面。 第3章、设备管理实现: ●基本要求:设备管理主要包括设备的添加删除、设备的分配回收、同时实现设备独立性。 ●参考学时:6学时 ●参考资料: 假定模拟系统中有键盘鼠标打印机显示器四个设备三个控制器两个道,采用安全分配方式。 1、设备管理子系统涉及到系统设备表(SDT)、道控制表(CHCT)、控制器控制表(COCT)设备控制表(DCT)来体现输入输出系统的四级结构三级控制。我们模拟这样的数据结构来完成对外围设备的管理。 (1)添加设备:增加对应的设备控制表系统设备表中的表项,如果需要新建对应的控制器控制表。 (2)删除设备:删除对应的设备控制表系统设备表中的表项,如果需要删除对应的控制器控制表。 2、设备的分配回收,进程申请设备的时候,建立起路,即获成功;否则阻塞到道、控制器设备上面。进程回收设备的时候,把阻塞进程唤醒。 3、设备分配必须满足设备的独立性要求。为了实现设备独立性,要求在驱动程序之上设计一层设备无关软件,其主要功能可分为: (1)执行所有设备的公有操作,主要包括:(a)独占设备的分配与回收;(b)将逻辑设备名映射为物理设备(LUT),进一步可以找到相应物理设备的驱动程序。 (2)向用户层(或文件层)软件提供统一的接口。例如,对各种设备的读操作,在应用程序中都用read; 而对各种设备的写操作,则都使用write。 第4章、文件管理系统实现: ●基本要求:利用交互式命令实现树型目录结构文件管理,同时利用位示图表示外存的分配情况,新建文件时分配必要的空间,模拟文件分配表记录文件在外存上的存储方式。 ●参考学时:8学时 ●参考资料: 在文件中保存目录内容,创建文件或子目录可以用命令行命令:MD、CD、RD、MK(创建文件)、DEL(删除文件)DIR。目录项包括文件或目录名称、类型(文件、目录或空目录项)、创建日期以及下一个目录项指针、下一级目录项指针。 1、创建初始文件,建立根目录的“.”“..”目录项。 2、显示命令提示符“$”。 3、输入命令后根据命令含义完成相应文件操作: MD:在目录文件中创建子目录,同时搜索当前目录最后一个目录项,并保存指针信息; CD:根据当前目录切换到指定目录; RD:搜索所要删除的目录是否为空目录,若是则删除; MK:在当前目录中创建文件名称;(申请空间利用位示图修改FAT) DEL:搜索所要删除的文件是否存在,若是则删除;(恢复位示图修改FAT) DIR:列出当前目录的所有目录项。 4、在创建文件的时候分配空闲的磁盘空间,采用显示链接的方式,利用文件分配表(FAT)记录文件在外存上的存储情况。 5、当删除文件时,回收外存上的空间,修改位示图文件分配表。 第5章、进程调度算法的实现: ●基本要求:实现先来先服务FCFS、短作业优先SJF以及时间片轮转调度算法。 ●参考学时:6学时 ●参考资料: 根据创建进程的系统时钟,取相对时钟作为进程的到达时间,利用随机数产生每个进程的估计运行时间。利用模拟系统中提供的算法分别计算其相应的周转时间带权周转时间。 1、利用绝对时间相对时钟产生一组进程的到达时刻运行时间。 2、实现FCFS算法:根据进程的到达时间的先后次序来完成对若干进程的调度。 3、实现SJF算法:根据当前时间已经到达进程的需要运行时间选取其中时间最小的进程最先运行。 4、实现时间片轮转算法:首先要求确定时间片的大小,依据进程的到达时间依次加入队列,每次分配一个时间片大小的时间,如果没有完成参与下一次的竞争,当最后需要一个小于等于时间片的时间时本进程完成,同时退出队列。 5、计算每种算法调度后,系统的平均周转时间平均带权周转时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值