003-软盘启动原理

来源:互联网 发布:手机均衡器软件 编辑:程序博客网 时间:2024/06/08 07:06

       软盘,这东西虽然现在很罕见了,但是在20年前,软盘是主要的外部存储器,再早一点的时候还没有硬盘,所有的数据都是存放在软盘上的,当然也包括操作系统。我们之所以仍然选择软盘作为我们操作系统的启动介质,是因为软盘有着其特点和明显的优势。如果我说硬盘,你可能第一反应会问我多大的硬盘,因为硬盘的种类很多。但是软盘就没有这么麻烦了,普及过的软盘就只有两种而已,而最常用的也是使用时间最长的,就是3.5英寸软盘,它的大小恒为1440KB(注意写成1.44MB是有歧义的,因为这里的进制一般使用1000进制或者1024进制,而3.5英寸软盘的大小是1,474,560Byte,如果按照1024进制来算应该是1440KB或1.41MB,如果按照1000进制的话是1474KB或1.47MB,所以1.44MB的说话有点混乱了。)

       既然是1440KB,那么对它的内容限制也就比较容易和规整。一个存储介质,直接拿来用是非常不方便的。比如说,我们一个U盘里有64GB的东西,但是当你把U盘插上以后,就立刻可以看到U盘里有多少文件,剩余空间有多少,这当然不可能是把U盘全部读过一遍才知道的,这就说明,我们存储介质应当是按照一定的方式来存储文件的,一定会在某一位置存储了一个文件的访问索引表,所以,只需要读取这个索引表就可以很快地知道存储介质中的数据存储情况,也可以快速定位。当然不仅仅是这些,针对于软盘来说,我们还需要保存它的磁道、磁头、扇区的信息。这些信息都需要存储空间,我们按照一定的组织逻辑来管理数据的过程,就称为格式化,这也正是磁盘格式化后实际使用空间会小于原始空间的原因所在。

       一个软盘,其实也就是一个单磁盘的硬盘,它拥有80个柱面(0-79),2个磁头(正反面,0-1),18个扇区(1-18),每个扇区有512字节的存储位置,所以,一张软盘的大小就是80×2×18×512=1474560Byte=1440KB。柱面的英文是Cylindrical Surface,简写为C,磁头的英文是Head,简写为H,扇区的英文是Sector,简写为S,所以比如我们要表示45柱面1磁头6扇区就应当记做C45-H1-S6。

      根据BIOS的设计,如果BIOS被设定为软盘启动的话,计算机会去读取软盘中的数据,首先会读取软盘的前77个字节,来判断软盘的类型,在FAT12格式的软盘中对前77个字节是这样规定的:

开始地址结束地址占用字节作用0x000x023程序的第一条指令0x030x0a8启动区名称0x0b0x0c2每个扇区的字节数0x0d0x0d1每簇的扇区数0x0e0x0f2FAT起始位置0x100x101FAT的个数0x110x122根目录大小0x130x142磁盘大小0x150x151磁盘种类代码0x150x172FAT长度0x180x192每磁道的扇区数0x1a0x1b2磁头数0x1c0x1f4分区个数0x200x234磁盘大小0x240x263固定数据0x270x271卷标0x280x3211磁盘名称0x330x3a8格式名称0x3b0x4c18
空行

       所以只需要按照这种方式来填写,计算机就会以FAT12的形式来识别这张软盘。然后,计算机会检查这张软盘的第510(0x1fe)和第511(0x1ff)这两个字节的数据,如果这两个字节的数据是0x55和0xaa的话(不为什么,就是一个标记,没有什么特殊含义),就把该软盘的前512字节作为启动盘,然后执行0x0-0x2这三个字节(也可能只有前两个字节)的机器指令。如果510和511字节不是指定的数据的话,就会认为这张软盘仅仅是数据盘而并非启动盘,BIOS就会进行其他的动作(寻找其他启动盘或者进入待机状态)。所以,制作启动盘的第一步,就是把前77个字节按照规定写好,并且把510和511号位置数据写成55和aa,最后再在前3个字节的位置写上需要执行的命令(一般是一个跳转指令,然后运行其他位置的指令)就OK了。

       这里用到了一个软件BZ,这是一个十六进制编辑器(或者叫二进制编辑器),就是用来查看和编辑一个文件的机器代码的。当然了,要使用这个软件就首先得有Windows操作系统才行,在以前还没有操作系统的时候,我们是不可能借助这样的软件的,那就必须用实际的刻录机直接在软盘上烧录才行。然而今天我们只需要模拟这个过程就好了,所以我们只做一个1440KB的img镜像文件来作为软盘数据,用BZ来书写这个文件就好了,然后我们使用VMware来加载这个img文件,相当于在实体机上插入了对应的软盘(虚拟技术真的很方便)。当然如果感兴趣,也可以通过刻录工具吧img文件写入软盘。不过在这里强调的是,把镜像文件写入软盘,和把镜像文件直接复制到软盘,这是完全不同的操作。因为如果你是用复制文件,那这个软盘必须是格式化完成的,你的镜像文件就是一个简简单单的文件,它会被存储在文件区,还会在索引区生成文件的索引(其实这根本不可能,因为你没有办法在1440KB的软盘中复制一个1440KB的文件,根本拷贝不下),而并不是把软盘按照我们镜像文件中的那种方式来书写,这一点有很多朋友都一直搞不清楚。(照理说如果不使用软件而是单纯的使用刻录机的话就不会出现这样难理解的问题,就是因为有了现在这样方便的工具,才让我们理解底层实现的难度变得更高,所以针对这些问题来说,到底是多想点好呢还是少想点好呢?)不太放心,还是再解释解释吧。比如说,我现在想在软盘中写上“12345abcde”,那么我就直接用刻录机在软盘上写上“12345abcde”就可以了,这没有任何问题。但是,什么是镜像文件呢,就是这里有一个文件,文件里的内容是"12345abcde000000000000000……",后面的那些0就是在实际软盘上应该都写成0,所以这个文件就是软盘里实际应该有的情况,一共1440KB,使用软件把img文件加载到软盘上的意思就是,参照img文件的样子,把软盘也写成“12345abcde00000000000……”这样,但是如果你把这个文件拷贝到软盘里(假设能考进去的话),软盘里实际的样子应该是"xxxxxx00000123.img0000012345abcde00000……zzzzzz",解释一下,前面的xxxxx就表示软盘格式化时写入的文件信息,后面是文件列表和索引,然后才是文件内容,最后还有一些其他的信息,所以,把文件直接拷贝到软盘中的话,软盘中的实际情况并不是我们需要的那样了。

       至此,启动盘就写好了,接下来的工作就是要写上一句合适的指令,然后执行ipl的内容,下次会说明img的具体写法以及ipl的启动。

0 0
原创粉丝点击