30天自制操作系统——第1天实验总结

实验日期实验项目
2020.09.24第1天 从计算机结构到汇编程序入门

一、实验主要内容

1、 内容1 映像文件的制作

(1).内容概要

  • 实验内容:开发一个操作系统的基本步骤是编写源程序,利用源程序生成机器代码,根据得到的机器代码制作软盘映像文件,最后制作好操作系统的启动盘。类似地,我们可以制作一个简单的软盘映像文件,来了解开发操作系统的简单流程。由于环境限制,采用qemu软件来模拟这个过程。
  • 实验重点:了解软盘映像文件的制作,并能够通过已有的机器代码制作出软盘的映像文件。

打开二进制编辑器,将已有的机器代码写入文件中,编写完成,需要将文件保存为xxx.img的格式。基本步骤如下:

	a.编写一个run.bat文件,这个文件的主要作用就是将之前写好的映像文件复制到对应的文
	件夹,并使用make进行文件的编译,最后运行。
	b.编写一个install.bat文件,这个文件的主要作用是安装我们写好的软盘映像文件。
	c.打开!con_nt.bat文件,输入run,观察运行结果。

(2).关键代码分析(由于本次是机器代码,不便于直接复制注释,采用截图进行说明)
在这里插入图片描述
代码中最左边是表示地址,中间的16进制是机器代码,最右边的字符是表示中间16进制机器代码对应的ascii码的值。0000 01f0处最后两个字节的55 AA是表示启动区的结束标志。

2、 内容2 汇编指令编写程序并制作映像文件

(1).内容概要

  • 实验内容:了解开发原理——CPU将接收以电信号发送的机器代码,并执行对应的指令,输出相应产生的电信号;采用汇编代码来编写程序,简化第一种方法(直接写机器代码)。使用DB,RESB指令在一定程度上缩短了代码的长度,并能使用命令行将xxx.nas文件生成xxx.img这个映像文件。最后还是利用qemu模拟器来模拟自制的操作系统的功能。
  • 实验重点:了解DB和RESB指令的作用和用法,并能使用作者提供的nask.exe工具生成映像文件。学会将常用的指令制作成bat批处理文件,便于可以直接在!con打开的命令行窗口中执行一些比较长的指令(不必每次都完全输入)

(2).关键代码分析
DB指令表示每次往文件中直接写入一个字节的指令
RESB指令表示从现在的地址开始空出多个字节的位置来。
源程序全是机器代码,使用汇编代码编写时,可以用DB指令将机器代码压入文件,其作用和直接写机器代码是一样的,RESB指令则可以将机器代码中为00的位置用语句代码表示,能够很好地减少代码量。

DB	0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
DB	0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
DB	0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
DB	0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
DB	0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
DB	0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
DB	0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
DB	0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
RESB	16   //这里表示从此地址开始的16个字节都是00
DB	0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB	0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB	0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB	0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB	0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65   //两个0x0a表示换行,接下来就是显示内容字符表示的ascii码,例如这里的0x68表示h,0x65表示e。
DB	0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
DB	0x6c, 0x64, 0x0a, 0x68 , 0x65, 0x00, 0x00, 0x00
;	DB  0x01, 0x02,0x03, 0x04, 0x05, 0x06,  0x07,  0x08
RESB	368   //这里表示从此地址开始的368个字节是00
DB	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB	4600  //这里表示从此地址开始的4600个字节是00
DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB	1469432  //这里表示从此地址开始的1469432个字节是00

3、 内容3 完全使用汇编代码编写程序并制作映像文件

(1).内容概要

  • 实验内容: 这次的实验是在内容2的基础上拓展的,内容2是汇编指令和机器代码相结合的方式编写的程序。这次则是直接遵循汇编代码的规范,完全使用汇编编写程序,实现内容2的功能。
  • 实验重点:熟悉DB指令的新用法,并了解DW和DD指令;明白汇编程序中部分代码写法的特殊含义,如RESB 0x1fe-$;了解并熟悉标准FAT12格式软盘专用汇编代码的书写。

(2).关键代码分析
DB指令还可以用来写入字符串,在DB后面直接跟上字符串即可。
DW指令是表示向文件中写入2个字节,DD则是表示向文件中写入4个字节。
相比于内容2的代码,内容的代码中将FAT12格式软盘的定义使用汇编代码表示,显示的信息直接用字符表示,使用0x1fe-$ 汇编代码会自动计算在输入信息和0x55AA之间需要多少00。

; hello-os
; TAB=4
; FAT12格式软盘专用代码
		DB		0xeb, 0x4e, 0x90
		DB		"HELLOIPL"		; 启动区的名称可以是任意的字符串(8个字节)
		DW		512				; 每个扇区的大小,必须为512字节
		DB		1				; 簇的大小,必须为1扇区
		DW		1				; FAT的起始位置,从第1个扇区开始
		DB		2				; FAT的个数
		DW		224				; 根目录的大小,一般设成224
		DW		2880			;该磁盘的大小,必须是2880扇区
		DB		0xf0			; 磁盘种类,必须是0xf0
		DW		9				; FAT长度,必须是9扇区
		DW		18				;1个磁道有几个扇区,必须是18
		DW		2				; 磁头数必须是2
		DD		0				; 表示不使用分区
		DD		2880			; 重写一次磁盘大小
		DB		0,0,0x29		; 固定写法
		DD		0xffffffff		; 卷标号码
		DB		"HELLO-OS   "	; 磁盘名称
		DB		"FAT12   "		; 磁盘格式名称
		RESB	18				; 

; 程序主体
		DB		0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
		DB		0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
		DB		0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
		DB		0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
		DB		0xee, 0xf4, 0xeb, 0xfd
; 信息显示部分
		DB		0x0a, 0x0a		; 两个换行
		DB		"hello world!  heloo os "
		DB		0x0a			; 改行
		DB		0
		RESB	0x1fe-$			; 填写0x1fe-$个00
		DB		0x55, 0xaa          ;启动区的结束标志
; 启动区以外部分的输出
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	4600
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	1469432

二、遇到的问题及解决方法

1、 描述问题1

在这里插入图片描述

  • 问题描述

运行时报错,报错信息显示不是可引导磁盘。第1次运行程序可以执行,第2次运行将显示信息修改为“I’m a student. I am from Yunnan”就发生了报错。当输入显示信息边变长时,代码后面的内容会被逐个覆盖。

  • 解决方法
a.产生原因:由于显示信息后面全是00,覆盖后应该没有影响。找到非00的地址处,对照课本,发现导致该问题的原因是在0001f0处的55 AA被覆盖了,软盘启动区的最后两个字节必须是55 AA,修改代码时没有注意到在地址为0001f0处的55 AA被覆盖了。
b.解决方法: 0001f0处的机器码改为0x55,0xAA,这样计算机才能确定这个扇区的开头就是启动程序,并开始执行这个程序。

2、 描述问题2

  • 问题描述

周六的时候继续准备运行程序写日志时,发现!cons_nt.bat文件无法运行,而run.bat文件却可以运行。对比批处理文件(xxx.bat)中的内容,发现!cons_nt.bat中的是cmd.exe命名,可能的原因是在bat文件中无法运行cmd了。

  • 解决方法
	a.产生原因:系统缺少环境变量。可能是在配置其他环境变量的时候误删了。
	b.解决方法

使用win+R打开cmd命令行窗口,用cd指令到helloos0文件夹下,这样可以直接运行!cons_nt.bat文件了。但是每次都需要输入对应的路劲,比较繁琐。换一种方便的方法,直接添加环境变量,操作如下
在这里插入图片描述

三、程序设计创新点

1、 描述创新点1,关键代码及结果截图

  • 创新点1

本次实验主要是初步了解自制操作系统的原理,学会制作映像文件,初始汇编指令。三个实验内容中用到了将ascii码表示的字符输出,这里可以将修改ascii码的值来实现实现不同的字符或者英语单词,这里修改显示的字符为“Hello ,world. I’m a student. I am from Yunnan”,两行‘*’和‘-’等。在不断尝试的过程中,发现只有在一定的区域内写入的信息才能显示,如果超出了0000 01f0,结果就不会显示,字符“python,matlab,csapp”就不会显示。

  • 关键代码
    在这里插入图片描述
  • 结果截图
    在这里插入图片描述
    和预期一样,在55 AA之后的“python matlab csapp”没有显示出来,而前面的所有内容均显示出来。

四、实验心得体会

  • 实验对于工科来说是一个必不可少的环节,从理论到实际动手操作的实践,也是对所学知识的巩固。去做好每一个实验的关键就是理解原理,先去模仿,一定要动手,只有这样才能深刻了解到其中深一层的原理,也是创新的关键一步。30天自制一个操作系统好像挺难的,但是分解到每一天,从0基础开始开发一个操作系统,相信自己也能结合已有教材开发的系统有所创新,有所收获。
  • 本次实验从零基础开始照着教材写了一个类似操作系统的代码。在初次接触这部分内容的时候,并不清楚它到底是如何实现的,为什么这样做就可以实现?对其中的原理充满了疑惑,在反复阅读教材的过程中也注意到了一些细节,例如启动区的最后两个字节必须是0x55,0xaa。学会了批处理文件的使用,了解了FAT12软盘格式的专用代码。在理解原理后,关键在于自己的动手实践,很多问题也只有在实际操作的过程中才会发现,才能从中学到制作背后依据的原理。
  • 遇到问题时,首先需要去参看教材相关内容,反复阅读,去理解其中一些细节,另外教材的部分内容也需要看是否有误,如果没有问题再去网上查阅相关资料对比教材内容。对于长时间没有解决问题,需要询问老师或者同学,以免浪费过多的时间。
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值