在我其他事还没折腾出个结果的时候,就让我发现了做操作系统这个东西,当然,目标只是一个小的不能再小的(甚至能不能叫操作系统都是个问题),因为我实在很好奇,虽然查过很多,但是不能从根源上了解一下计算机,就总觉得缺了什么
(刚发现,由于自己激动,写了一堆废话,所以为了大家着想,重点部分开头加个重:,其它重点我也加粗)
前两天心血来潮,想起这样一件事,很容易的搜索到两本书《30天自制操作系统》以及《一个操作系统的实现》(以下还是简称一下书一和书二吧,毕竟名字那么长),就决定是他们了
今天有了时间,我就开始动手了,首先怎么说都得来一句Hello World!恰好这两本书也是这样的,不过为了尽量在真实的同时方便,我就使用虚拟机了
书一中是从二进制开始的,然后逐步将其变为汇编代码,我觉得自己可以理解这个过程,就偷偷的跳过了(虽然可以拿提供的源代码试,但是懒啊),书二是直接从汇编开始的,它的代码更少,我们就采用它的了
不管怎么说,我们总是得用到汇编的,不过需求应该不大,写过一些基础的代码就可以了,下面要开始第一步了,汇编部分
1. 汇编代码
这恰好到学汇编的一学期,对80x86那个环境啊,是真的让人脑壳疼,我一个64位的机子要写去16位,要不dosbox,要不虚拟机上masm32或者masm for windows,dosbox和masm for windows这俩我不想采用,见过sublime,vscode,as这些之后,我实在是看不下去,而两天前我为了完成作业,在虚拟机上(win7 32位)用masm32和官方的包成功搅合在一起,然后用sublime写代码,不过需要虚拟机,有点麻烦
而今天,我发现两本书都要用nasm进行汇编,妈耶,我实在不想配了,还要折腾我,在几次找书中的代码对应的masm代码未果后,不得已,我还是接受它吧
下载地址:https://www.nasm.us/pub/nasm/releasebuilds/2.14/win64/nasm-2.14-win64.zip
也可以自己去找,官网上很好找的
果然,逃脱不了真香定理,我发现它真的是舒服,只需要解压,直接就可以运行,没错,相当简单,配个环境变量就更舒服了,虽然没有试过在windows上编个小程序试试,但是就以这编译来说,至少在这里,绝对够了
重:下来展示我们的代码(没有汇编代码的高亮,我不上图了,方便复制)
; 参考书二的代码
ORG 0x7c00
MOV AX, 0x7c00
MOV SP, 0x7c00
MOV DS, AX
Call print
jmp $
print:
; ES: BP储存了message的地址
MOV AX, message
MOV BP, AX
; CX中放要输出的串的长度
MOV CX, 15
; AH=13H,AL=01H
MOV AX, 01301H
; BH=0(页号为0),BL=0CH(黑底红字)
MOV BX, 000CH
MOV DL, 0
; 10号中断,BIOS显示I/O功能调用
; AX=13H输出字符串,其它的也都一样,都看成是参数
INT 10H
RET
message:
; 要输出的字符串
db "Hello, OS world!"
; 用0填充到510字节,最后两字节为55和AA
; 不过我试过,删了也没有错误发生,不过最好加上
times 510-($-$$) db 0
dw 0xAA55
重:接下来需要编译,使用刚提到的nasm,要生成bin文件
nasm filename.asm -o filename.bin
接下来就要制作启动镜像了,当然得使用UltraISO了
2. 使用UltraISO制作ISO镜像
(1) 重:首先新建启动光盘映像
(2) 重:加载映像,使用刚刚生成的bin文件
(3) 重:之后保存就好
但是,我们怎么能用这么低效率的方式呢,到第四步我们改变一下这个做法
3. 使用Vmware运行
重:这就简单了,和正常的一样,只是将使用的镜像是上一步生成的ISO镜像
重:第四步可选,只是为了让整个过程更快速,也可以直接跳到最后看一眼结果
4. 提高效率的一步
在汇编代码所在目录下建立一个make.bat
@echo off
:: 编译汇编代码
nasm %1.asm -o %1.bin
:: 因为如果原本有这个文件,会弹窗询问是否覆盖,为避免点击所以先删除
del %1.iso
:: UltraISO的命令行方式,-bootfile指定引导文件
UltraISO -bootfile %1.bin -output %1.iso -silent
del %1.bin
只需要运行make filename
就可一步生成iso文件(filename不包括后缀.asm)
我是为了在sublime中运行,所以这样写,大家可以直接把%1换为文件名(注意UltraISO那条命令中要写绝对路径)
而我在sublime中有
{
"shell_cmd": "make ${file_path}\\\\${file_base_name}"
}
这样Ctrl-B之后就可以直接调用使用Ctrl+B开启,使用Ctrl+E关机,而且不会关闭这个标签页
至于在虚拟机那里,这个界面下
这样下来,我就可以在sublime中Ctrl+B编译并生成ISO文件,然后Alt+Tab切换到虚拟机,Ctrl+B开机,看到结果之后Ctrl+E关机,再切换回去
5. 展示结果
最后必须得展示下结果,哈哈哈,虽然有点简单只有一行字