30天自制操作系统-day01
前言
旧坑未填,又开新坑
好久没更新blog了,想开一个新坑,《30天自制操作系统》,相信不少人都听说过这本书,今天翻看了一下,发现挺有趣的,于是开始动手。
这一系列的文章并不会详细介绍相关知识,例如汇编、makefile等,只是介绍如何实现书中的操作过程
由于书是图书馆借的,没有光盘中的资料,于是一顿搜索,发现GitHub的这个仓库里有全套的源代码+中文注释。非常感谢这位老哥的帮助!
一翻书,发现作者使用的汇编器是自己写的(据说是认为nasm太慢),而且使用的操作系统和硬件(使用的是软盘)太古老了。
因此这里我使用的是:
编辑器:VSCode
汇编器:nasm
虚拟机:qemu
这些软件的安装我就不做说明了(记得都加入环境变量),注意VSCode里安装这些插件:Hex Editor
、x86 and x86_64 Assembly
手动打机器码
按照书里的步骤,我们先体验一下二进制打印一个Hello world
使用VSCode新建一个文件,命名boot.bin
,使用Hex Editor
打开(按快捷键Ctrl
+ Shift
+ P
,输入hex
就会出现使用十六进制打开)
除了下面几段外其他全是00,慢慢敲吧,如果想偷懒,可以去我的仓库下载这个文件(如果没有这个仓库说明我还在鸽,咕咕咕~~~)
国内经常打不开GitHub点击这里下载😀
第一段:
第二段
第三段
一直填充00到0x00167FF0
那一行填满
然后我们就得到了一个可以成功引导的镜像文件啦
下面我们运行它
运行镜像
打开命令行,进入目录,简简单单,一行命令
1 | qemu-system-i386 -drive format=raw,file=day1.bin |
你因该能看到:
可以看到,打开了一个窗口,运行了我们的Hello, world
完成这一步,我们到底做了什么呢?
我们用手动敲机器码的方式实现了一个小程序,实际中估计没有多少人这么做,毕竟及时是本书的作者也不太可能用手动写机器码的方式为我们提供了这段代码(考虑到这本书的作者写过汇编器,我还是加个“太”字吧。。。)
一般情况下,我们真正要做的事是写汇编代码,然后使用汇编器帮我们将汇编代码翻译成机器码,注意是“翻译”,不是“编译”,因为写汇编本质上还是在写机器指令,只包括稍微可读了一些。
使用汇编器
由于这本书第一天并没有介绍太多汇编指令,这里我们还是手写机器码,只不过不用按那么多00
了,这一步由汇编器帮我们完成。
与上面的手动打机器码等效的汇编代码如下:
1 | ; hello-os |
注意,书中作者使用的是自己写的汇编器nask,由于找不到64位的程序,我使用的是nasm汇编器,所以语法有些变化,参照这篇文章
将文件复制并命名为boot.asm
,不过我还是建议自己打一遍
使用如下命令汇编:
1 | nasm -f bin boot.asm -o day1.bin |
同样,使用qemu运行
1 | qemu-system-i386 -drive format=raw,file=day1.bin |
运行的结果应该是一样的,这里就不放图了,你可以用SHA1验证,生成的文件与之前手打的一模一样
1 | certunit -hashfile SHA1 day1.bin |
第一天结束
【完】