自制操作系统 | day1

本文介绍了如何使用二进制编辑器创建软盘映像文件,并通过QEMU模拟器运行。文中强调了CPU对二进制信号的处理,以及汇编语言在操作系统开发中的作用,特别是DB和RESB指令的运用。此外,还提到了使用ASM批处理文件简化生成helloos.img的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一种工具软件名为“二进制编辑器”,是一种能够直接对二进制数进行编辑的软件。
https://www.vcraft.jp/soft/bz.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8vwykHEt-1678682911694)(:/ba0739fe46684291a05f90f26f21edea)]
下面跟着这个机器码输入:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S4uLv7E6-1678682911697)(:/90df4d71d9734ae1aaacbf036b5c1f9c)]

从000090开始后面全是0,一直输入到168000这个地址。中间只需要改动两个地方:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y48n6e7q-1678682911699)(:/ae1aec13eb8449f89d9b09af257d4d7b)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UZzMo4xM-1678682911702)(:/4fce9b4d64264c0b8a48c2ff8b2d791b)]

下面,我们把输入的内容保存下来就完成了软盘映像文件的制作,这是查看一下文件属性,应该能看到文件大小正好是1474560字节。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KmEjA7z4-1678682911706)(:/dd69a76ddf0f44efbfd4248995d430f5)]

保存一下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u6ZLQkjU-1678682911706)(:/4a53fdef7401420288581f8680b1eac5)]

在github找到tolset文件夹,https://github.com/yourtion/30dayMakeOS

把这个文件夹复制到硬盘任意一个位置上。现在里面的东西还不多,只有3MB左右,不过以后我们自己开发的软件也都要放到这个文件夹里,所以往后他会越来越大,硬盘上最好留出100MB左右的空间。

接下来打开刚才复制的tolset文件夹,在里面新建一个文件夹,命名为helloos0。将helloos.img复制进来。
在这里插入图片描述将tolset文件夹下z_new_w子文件夹中的!cons_9x.bat和!cons_nt.bat这两个文件也复制到helloos0文件夹里。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SjcNPPoT-1678682911710)(:/59906ee3b9e7426fb44cf488ddb6b6f8)]

在helloos0新建txt文件,填上下面内容,重命名为run.bat。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbQEdHZj-1678682911713)(:/c930d4a7e074460c901d096dd3f1de23)]
同样步骤,创建install.bat,并将下列内容输入进去。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JShhBBDq-1678682911714)(:/c5c7bc49a9ba449c9285a77071a0de1f)]

这里我们不选择用软盘制作启动盘,因为重启电脑真是太麻烦了。这里使用模拟器就行了,只需要在!cons_nt.bat打开的命令行窗口输入“run”指令就可以了,然后一个名叫QEMU的非常优秀的免费PC模拟器就会自动运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uoVVlLr6-1678682911716)(:/08f6f998576b4192a73a5cf85f69cece)]
为什么用这种方法就能开发出操作系统来呢?电脑的处理中心是CPU,翻译成中文就是“中央处理单元”。不过这个CPU除了与别的电路进行电信号交换以外什么都不会,而且对于电信号,它也只能理解开(ON)和关(OFF)两种状态。CPU就是个集成电路板,它只是忠实地执行电信号给它的指令,输出相应的电信号。

其实我们编写的程序最终都要转换成所谓的机器语言,这些机器语言就是以电信号的形式发送给CPU的。这些机器语言不过就是一连串的指令代码,实际上也就是一串0和1的组合而已。软盘的原理也有异曲同工之妙,简单说来,就是把二进制的0和1转换为磁极的N极和S极而已,所以我们只用0和1就可以写出映像文件来。不仅是映像文件,计算机所能处理的各种文件最终都是用0和1写成的。

而二进制编辑器就是用来编辑二进制数的,我们可以很方便地用它输入二进制数,并保存成文件。也就是说只要有了二进制编辑器,随便什么文件我们都能做出来。但是由于全写二进制太浪费纸张了,所以计算机界普遍使用十六进制数。将二进制数转换为十六进制数,只要从二进制数的最后一位开始,4位4位地替换过来就行了。

现在我们来写一个汇编程序,用它生成一个跟刚才完全一样地helloos.img。这里我直接拷贝了github里的源文件helloos.nas、asm.bat。有了这个批处理文件,我们只需要在!cons_nt.bat打开的窗口里输入asm,就可以生成helloos.img文件。再输入run命令,就可以得到和刚才一样的结果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4kndLdyh-1678682911721)(:/d10e6ccadc0f47649061fc0144280b83)]

汇编文件的源代码如下,有兴趣可以自己编写:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eUP6fEiB-1678682911722)(:/f38234b6a3fc4bb38dee497653e2c7e9)]

DB指令是“define byte”的缩写,也就是往文件里直接写入1个字节的指令。这个指令是程序员的杀手锏,也就是说只要有了DB指令,我们就可以用它做出任何数据(甚至是程序)。

RESB指令是“reserve byte”的缩写,如果想要从现在的地址开始空出10个字节来,就可以写成RESB 10,意思是我们预约了这10个字节。

可以改写一下源文件,让别人也能看懂。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWX62afX-1678682911723)(:/e2d5da9755bd479d915a83c0d88f5509)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFTaLWhR-1678682911725)(:/33c1675b7c97481eacdd2fa73ebe4522)]

首先是“;”命令,这是一个注释命令,相当于C语言中的“//”。

其次是DB指令的新用法,我们居然可以直接用它写字符串。在写字符串的时候,汇编语言会自动地查找字符串中的每一个字符所对应的编码,然后把它们一个字节一个字节地排列起来。

DW和DD指令分别是“define word”和“define double-word”的缩写,word指的是2个字节,double-word指4个字节。

RESB 0X1FE-$。这个美元符号是一 个变量,它可以告诉我们这一行现在的字节数。在这个程序里,我们已经在前面输出了132字节,所以这里$就是132。因此我们先用0x1fe减去132,得到378这个结果,然后连续输出378个字节的0x00。之所以用变量是为了改变我们想要输出的字符串,我们必须保证软盘的第510字节(即第0x1fe字节)开始的地方是55 AA。如果使用变量,汇编语言会自动计算需要输出多少个00,我们也就很轻松地改写输出信息了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWfWcH6f-1678682911726)(:/410a51e173b44695b8085c70ae6df03d)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NiMOST6V-1678682911728)(:/5b22ef7aaf15469d924feef27a660602)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值