30天自制操作系统(day1)

day1

  • 关于自己的初心
  • 资源分享
  • 开始今天的内容
    • 1.编写软盘映像文件(.img)
      • 方法1(用binary editor写)
      • 方法2(copy)
      • 方法3(汇编)
    • 2.搭建软盘映像文件的运行环境
      • 开始第一个汇编程序

关于自己的初心

楼主现在大二,最初在学长的启发下买了一本名为操作系统真象的书还原打算作为自己简历上的一个项目,无奈在忙活一天后还是在搭建环境上出了问题,于是乎就打算先放一放等到大三再来完成。后在知乎搜索操作系统相关内容时看到了他人对于这本书的介绍,了解一番后还是觉得本书比较符合楼主当前水平,于是乎决定从现在开始学习这本书,并且争取在下学期开学前完成这个简单操作系统的编写。并且也是想借此机会记录自己的学习过程并且顺带学习Markdown的使用,于是就有了这篇博客,希望自己能坚持下来,也希望自己的博客能给后续学习这本书的同学提供一点帮助。

资源分享

关于本书光盘中的源码文件以及开头编写软盘映像文件要用的Binary editor(解压即用)我已全部打包好了,点击链接即可下载。
光盘文件+Bz
提取码:alex

开始今天的内容

1.编写软盘映像文件(.img)

方法1(用binary editor写)

打开分享文件中Bz1621.lzh文件夹下的Bz.exe,新建一个.img文件,然后根据书本内容输入即可。
可能会遇到的问题:

  • 打开之前编写的.img文件后无法编辑,并且根据书中提示点击edit栏下的Read Only也无济于事。
    解决方法:点击Tools->Advanced 将其中Max size of file 从1024设置为2000即可(因为最终的.img文件大小为1474560字节,大于1024KB),如下图所示。(ps:这个问题困恼我一个半小时,真的谢。)
    30天自制操作系统(day1)_第1张图片
    另外给手动输入的同学一点建议:复制粘贴00过头以后可以直接把光标移到168010行,然后按ctrl+shift+end 就可以直接全选168000行以后的所有内容了,然后按删除就大功告成了~

方法2(copy)

直接去光盘附带的文件中复制helloos.img,因为这相当于抄作业,所以几乎不会遇到问题。

方法3(汇编)

恰巧这是我人生第一个汇编程序,俗话说万事开头难,所以楼主在这里再次对作者表示感谢~
在进行汇编编写之前需要先搭建环境。所以让我们先搭建一下环境

2.搭建软盘映像文件的运行环境

  • 第一步
    打开光盘文件,将根目录下的tolset文件夹复制到自己电脑上(我图省事直接放在桌面),然后在tolset文件夹下创建一个名为helloos0(你可以取你喜欢的名字)的文件夹,然后把刚才编写的helloos.img复制过来。

  • 第二步
    tolsetz_new_w文件夹下名为!cons_9x.bat!cons_nt.bat的两个文件复制到helloos0文件夹里,这两个是批处理文件,可以帮助我们一键打开命令行窗口,可见作者为了小白能顺利做实验操碎了心。

  • 第三步
    同样需要创建两个批处理文件,不过这次要自己写
    helloos0文件夹下创建一个.txt文件并命名为run.bat(注意是要更改后缀为.bat),然后右击点编辑,内容如下

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

在同样位置创建一个.txt文件并命名为install.bat,同样右击编辑,内容如下

..\z_tools\imgtol.com w a: helloos.img

注意:书上关于这两部分的代码不能直接原封不动copy过来,应以光盘文件中的内容为准
ps:以上内容作者都非常贴心地为大家做好了,懒得动手的朋友可以直接去光盘文件夹projects\01_day里复制helloos0文件夹(当然我和作者一样还是希望大伙动手体验一下)

这个时候点击!cons_nt.bat打开命令行窗口,再输入run就好了,这个时候就会运行模拟器然后显示"hello world",如下图所示

30天自制操作系统(day1)_第2张图片
温馨提示:要是点击QEMU窗口以后鼠标不见了的话,按ctrl+alt就可以重新让鼠标出现(其实是返回自己的电脑)

开始第一个汇编程序

要编写一个汇编程序,同样创建一个.txt文件,然后改名为helloos.nas.然后把原来的二进制代码copy过来就行了,但是我太懒了没有造做,就把书里的插图放出来吧。
30天自制操作系统(day1)_第3张图片
这个时候我们点击!cons_nt.bat打开控制台输入下面这条指令

..\z_tools\nask.exe helloos.nas helloos.img

然后就可以发现在当前目录(helloos0)下生成了helloos.img(当然你要把旧的删掉再编译才能发现它又生成了)

这时大家会发现汇编代码和二进制代码一样都是十八万多行,完全没啥优化。那么接下来我们将用一些指令使我们的汇编程序更像一个程序而不是机器码。在放出优化后的代码之前,请允许我先介绍一下将要用到的两个汇编指令~

  • DB指令是"data byte"的意思,表示接下来每个操作数将占用1个字节。比如如果我们写DB "HELLO",那么“HELLO”的每个字母都会单独占用一个字节的空间。
  • RESB指令是"reserve byte"的意思,表示预留多少个字节的空间,并且用0填充。比如我们写RESB 10,那么编译器就预留10个字节的空间,并且每个空间都填入0x00。

以下是优化后的汇编代码内容,是我自己手打的,所以相比光盘的内容注释不是那么完善和美观

;hello-os
;TAB=4

;以下是标准FAT12格式软盘专用的代码

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

;后面的内容是注释,和c语言的//功能一样。关于开头的FAT12软盘专用代码大家也不用深究。毕竟作为一个初学者,但操作系统就够我们折腾的了。

另外,由于每次修改汇编程序以后都要在控制台输入指令进行编译,为了方便这个过程,我们可以创建一个名为asm.bat的批处理文件,内容和我们一开始用到的指令一样

..\z_tools\nask.exe helloos.nas helloos.img

到目前为止,如果想启动我们这个小小的操作系统的步骤是 点击!cons_nt.bat 打开控制台->输入指令 asm ->输入指令run
当然,如果没有对helloos.nas进行改动的话,可以省去asm的编译步骤。

关于day1的内容就总结到这里了,如果读者朋友有什么建议或者发现不足之处,欢迎在评论区留言交流,楼主不胜感激!

你可能感兴趣的:(操作系统,c语言,windows)