30天自制操作系统学习-第1天

                                                                  第一天

 1 批处理文件:直接由DOS命令行解释执行的文件,通常后缀名为.bat或.cmd。

 2 镜像文件:.img后缀的文件,可用于制作操作系统文件,一个3.5英寸的软盘容量为1440k。

 3 nask:作者自己制作的汇编代码编译器,代码与nasm代码相差不大。

 4 qemu:虚拟机的一种,命令行操作。

在作者给出的光盘文件中找到z_tools文件夹:

helloos0版本:

可以看到作者给出所需的nask.exe文件和make.exe,qemu.exe等文件。

自己在硬盘任意位置新建项目文件夹,将z_tools文件夹放置与与helloos不同版本文件夹的同一个根目录下,如下图所示:

作者给出的helloos0版本的OS是直接手动输入机器码产生的.img镜像文件,大小为1440kb,刚好为一个3.5寸软盘大小。

这个helloos.img镜像文件可以直接使用虚拟机当做系统运行的,在这里我使用的是VMware虚拟机,新建虚拟机,在最后一步配置硬件时我们不使用光驱,添加一个软盘,,选取项目下的helloos.img文件:

开启虚拟机,我们可以看到虚拟机屏幕中间出现了 hello word字样:

我们使用sublime Text查看作者给出的helloos.img文件:

可以看出.img文件为二进制数据,二进制数据是计算机可以理解的数据。但是作者给出的这个文件足足有9万多行二进制数据,

如果手动操作输入的话,不免太过浪费时间。观察数据我们可以知道,在第9行二进制数据后的数据,全部都是0000 0000 0000

0000,这些数据仅仅是为了凑够1440kb数据,凑够一个3.5英寸软盘大小。

helloos1版本:

为此我们需要学习汇编语言,使用汇编语言对内存进行分配。helloos.nas文件:

这段nask代码定义的字节数刚好1440kb,其中的DB(Define Byte)是定义字节的意思,RESB则是预占内存空间的意思,

RESB 16意思是从现在占用了16个字节,但是并不适用,默认为0x00(16进制),下述定义以此类推。

你可以计算一下这样定义的字节数与作者给出的helloos.img的文件字节大小,结果恰好相等。

现在我们使用作者的nask汇编文件定义好了一个1440kb大小的helloos1.nas文件(这里的1440kb并非helloos.nas文件大小),

要如何编译成helloos.img映像文件呢。

我们需要使用nask编译helloos1.nas文件,如果你使用VM虚拟机的话可以不使用作者推荐的qemu虚拟机,

这里我们使用作者的qemu虚拟机尝试启动我们制作的helloos.img镜像系统文件,作者在这里使用了批处理文件对helloos1.nas的编译,运行。

我们在helloos1文件夹下新建文本,输入文本 cmd.exe,保存文件,文件名修改为!cons_nt.bat。

新建文本输入: ..\z_tools\nask.exe helloos.nas helloos.img 文件名修改为asm.bat,

新建文本输入:

copy helloos.img ..\z_tools\qemu\fdimage0.bin
..\z_tools\make.exe    -C ../z_tools/qemu

文件名修改为run.bat。

这时我们已经做好了编译helloos1.nas文件,以及使用qemu虚拟机运行编译生成的helloos1.img文件的准备。

其中!cons_nt.bat的功能是在当前目录打开cmd命令行,

asm.bat的功能是使用helloos1文件夹的同级文件夹z_tools文件夹下的nask.exe根据helloos.nas生成helloos.img。

run.bat的功能是复制当前生成的hellloos.img镜像文件,使用qemu运行。

具体批处理功能其实我们查看其中内容就知道大概意思了,这里至于nask如何将.nas文件编译成.img文件;以及qemu是如何运行.img镜像文件的,我们在此并不深究。

接下来我们双击打开!cons_nt.bat文件,输入asm

可以看到在helloos1.nas文件相同目录下生成了helloos.img文件,接着我们输入run,回车键入,执行run.bat:

成功启动了qemu虚拟机,并且运行了我们使用helloos1.nas生成的helloos1.img镜像系统文件。

当然qemu的使用是使用命令行的,比较麻烦,建议启用VM虚拟机。

helloos2:

helloos2与helloos1的不同之处是作者修改了其中的.nas汇编代码:

; hello-os
; TAB=4
; 以下这段是标准FAT12格式软盘专用的代码
		DB		0xeb, 0x4e, 0x90
		DB		"HELLOIPL"		; 启动区的名称可以是任意的字符串(8字节)
		DW		512				; 每个扇区(sector)的大小(必须是512字节)
		DB		1				; 簇(cluster)的大小(必须是1个扇区)
		DW		1				; FAT的起始位置(一般从第一个扇区开始)
		DB		2				; FAT的个数(必须为2)
		DW		224				; 根目录的大小(一般设成224项)
		DW		2880			; 该磁盘的大小(必须是2880扇区)
		DB		0xf0			; 磁盘的种类(必须是0xf0)
		DW		9				; FAT的长度(必须是9扇区)
		DW		18				; 1个磁道(track)有几个扇区(必须是18)
		DW		2				; 磁头数(必须是2)
		DD		0				; 不使用分区,必须是0
		DD		2880			; 重写一次磁盘大小
		DB		0,0,0x29		; 意义不明,固定
		DD		0xffffffff		; (可能是)卷标号码
		DB		"HELLO-OS   "	; 磁盘的名称(11字节)
		DB		"FAT12   "		; 磁盘格式名称(8字节)
		RESB	18				; 先空出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		; 2个换行
		DB		"hello, world"
		DB		0x0a			; 换行
		DB		0

		RESB	0x1fe-$			; 填写0x00,直到0x00afe

		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

helloos2.nas不是使用定义机器码的形式,而是使用定义软盘扇区的形式,其中DW(Define Word)定义字,DD(Define Double word)定义双字。

其中hellloos2文件夹下的批处理文件与helloos1一样,我们双击运行!cons_nt.bat文件,输入asm,run,生成helloos2.img镜像,

并且在qemu虚拟机中运行,效果如下:

至此我们完成了第一天的学习,使用汇编制作了一个能显示hello world的"OS"了,本文如有不对之处,请指正。

光盘::https://github.com/ZhengRunDong/OS

猜你喜欢

转载自blog.csdn.net/qq511714326/article/details/82750633