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

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

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


实验的源代码较多,但是由于未完整实现一个功能,也不好上传到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是一个不错的调试工具,“图形化”界面&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值