万事开头难。
先不说自己有没有能力,自行编写一个操作系统。
就算真能克服种种困难,把操作系统写出来,也得有办法加载到硬盘中去才行。
震惊商城里倒是也能买到各种操作系统的源代码。
但购买点数够不够,只是一方面。
同样的问题,买来之后怎么写入到硬盘里。
在计算机没有安装任何操作系统时,如何将程序写入到硬盘呢?
江寒想起一个很久以前听过的笑话。
如果你买了一台全新的裸机,手头上又没有系统安装盘,你可以这样做:
找一部电话机,最好是带按键的,除了0和1,其他的按钮全都坏掉也无所谓。
然后找一根电话线,插在电话上,另一头用打火机烧一下,撸掉多余的包皮,接在硬盘的数据线接口上。
接下来,就可以用电话上的0和1两个键,输入机器码编写操作系统、调试运行了。
看,很简单吧?
那么问题来了:如果连BIOS都没有,根本无法驱动硬盘,又该怎么办呢?
也好办。
首先,找一个螺丝刀,把硬盘拆开,再找一根针,在硬盘的盘片上戳。
这样硬盘里就被写上数据了……
当然,以上纯属扯淡。
真正的裸机编程,肯定要比这个复杂一些。
比如,可以仿照之前操作“雨菲一型”的办法,设计一组开关。
先切断存储器和数据总线的链接,然后操作开关,就可以在内存中写入机器指令了。
要不然,做一台纸带机,用在纸带上打孔的方式,来代替手动按开关,将程序输入到电脑里,也是可行的。
但这些办法做起来都太费事了。
如果有更简单的办法,又何必这么麻烦呢?
江寒重启了一下286,然后在自检的过程中,按住了“DELETE”键。
这样,自检结束后,就跳过了系统自举阶段,进入了BIOS的设置程序中。
BIOS设置界面非常简单,江寒很快在其中找到了一个关于ROM BASIC的选项。
80286是一款十分古老的处理器,只集成了13万个晶体管,最大主频仅有20MHz。
但就是这么落后的机器,却包含了一些十分有意思的功能。
在这种早期主板的ROM芯片中,常常会固化一个BASIC解释程序。
当相关的选项开启时,如果系统启动时找不到可引导的系统,将会进入ROM BASIC解释程序。
而不像后来的先进计算机那样,只给出一个错误信息,之后就什么也干不了了。
这个选项默认处于“关闭”状态,江寒将其设置为“开启”,然后按“F10”保存、退出。
系统重新启动,很快屏幕上就出现了“ IBM Personal Cputer Basic 1.0”、“ cht 1981”字样。
屏幕中还出现了一个一闪一闪的“_”,这就是提示符光标了。
屏幕的最下方,还有一行命令提示:“1、list,2、load,3、run……
现在就可以利用这个不到10KB的BASIC解释程序,来干点什么了。
这个BASIC语言解释器,可以说相当简陋,很多功能都没有内建,连浮点运算都不支持。
但厉害的是,却可以通过IO指令,直接读取端口和内存,以及调用一些系统中断。
这就给了用户很大的操作空间。
江寒先退出虚拟空间,去上找了几份关于ROM BASIC的教程,并下载了一份MSDOS3.31的软盘镜像文件。
没错,对于80286来说,跑太高版本的DOS,还是有些力不从心的。
而DOS3.31的功能和复杂度,刚好处于一个微妙的平衡点。
既不像6.22那样,占用太多可用内存;又不会像更早期的版本那样太过简陋,能干的事情太少。……
接下来,江寒就把MSDOS3.31对软盘镜像解压了一下,然后用一款非常牛掰的、能支持DOS软件的反汇编工具,对安装程序进行了静态分析。
再结合网上找来的那些资料,他很快就理解了MSDOS的运行机制,并搞清楚了硬盘主引导记录(MBR)的格式。
接下来,江寒就回到了虚拟空间,然后在ROM BASIC里,编写了一段程序。
这段程序执行时,会调用BIOS的INT13H中断,对磁盘进行读写。
虽然做起来很麻烦,但至少突破了最大的阻碍,可以把数据写入硬盘。