引导光盘原理

2021年9月15日 7点热度 0条评论 来源: charleyhuman

       引导型光盘的观念己成型许久了,只是要如何在Dos的平台上有此能力相较于Mac及Unix平台是比较困难罢了。对Mac及Unix系统而言,制作引导型光盘一直都不是问题,只要将这两个系统的硬盘,做Byte-to-Byte的拷贝,再将它写入CD-ROM,系统即会自动侦测并对此光盘进行开机的动作。但是如果你对Dos的硬盘做同样的动作,结果还是无法使CD-ROM开机的。 
       在Dos下,你需要有两个要素才可以读取CD-ROM:第一是需要有驱动程序随系统加载以便使系统能侦测到光驱的存在;第二便是需要有像MSCDEX的程序来分配一个磁盘驱动器编号给光驱以使Dos能从光驱读取文件。所以要制作一个可以在Dos下开机的CD-ROM首先的困难便是开机。一般Dos开机的程序是先要能将Dos的Shell COMMAND.COM加载,然后是驱动程序(Device Driver),再来便是MSCDEX可以分配磁盘驱动器编号给光驱,才可以读取CD-ROM的资料。但是如果要从光盘加载COMMAND.COM必需先加载MSCDEX才行,问题是如不先载入COMMAND.COM又如何能载入MSCDEX呢?要在载入COMMAND.COM之前就能侦测到CD-ROM存在的解决方案是透过修改电脑主机版上的BIOS(Basic Input /Output System)或是SCSI与IDE连接卡上的BIOS。一旦光驱被BIOS侦测到之后,CD-ROM必然有能力可以使得BIOS将COMMAND.COM载入。 
       Phoenix Technologies与IBM共同发表了引导型光盘的规格说明书El Torito,规格书中不但定义了引导映像(Bootable Image)该如何配置在CD-ROM中,还包含了有关开机型光盘制作与结构的一些底层的详细说明。这些底层的说明可能需要花些功夫来了解它,但好处是至少你可以运用现成的工具及CD-ROM的烧录程序即可完成开机型光盘的制作。此外,引导型光盘的规格仍不脱离ISO 9660的规范,意思就是说,如同其它正常的CD-ROM,Bootable CD-ROM是可以被正常复制或大量生产发行的,只是多了开机的能力罢了。使用者可以根据个人的需要,选择以CD-ROM开机或者将Bootable CD-ROM当作正常的CD-ROM来读取其中的档案,甚至于两者可以同时并存。
       制作一片Bootable CD-ROM的过程是非常冗长的,但是除非CD-ROM烧录程序的开发商能将程序发展成会自动将ISO 9660的Image File修改成Bootable的Image File,否则手动的方式还是最好的选择。事实上,Creative Digital Research的CD-R Publisher已经将制作开机型光盘的功能加入程序中,让使用者免去修改ISO 9660 Image的手续,只是程序注册的费用可不便宜,大约在四百多块美金左右。而另一方面,虽然手动的过程稍嫌繁复,但是弹性则比较大,至于为什么,后文自会鈙述。使用者于制作Bootable CD-ROM所需的背景知识虽不致如规格书中所提的需要对于BIOS INT 13、ISO 9660、ATAPI等知识有一定程度的了解,但是如果对于ISO 9660的扇区(Sector)结构有概念,那么制作Bootable CD-ROM就能事半功倍。
       要能读取Bootable CD-ROM的数据,首先你的PC的BIOS要能符合El Torito的规格以便能读取CD-ROM上的引导扇区。大部份的BIOS制造商都已赋予其CD-ROM的引导能力,也就是说现在大部份的计算机也都有此功能。Adaptec这家公司便是首先将开机能力加注在其SCSI卡的BIOS中。以1542CF为例,只要BIOS的版本是2.10或以后的版本都可让你从CD-ROM开机。要确定你的Adaptec SCSI Card是否有支持CD-ROM开机的功能,只要在开机时按下CTRL-A进入设定SCSI Card的公共程序,再选择Advanced Configuration Options的选项,此时如果你的SCSI Card有支持开机功能,你将会看到BIOS Support for Bootable CD-ROM的选项。
       在CD-ROM黄皮书(Yellow Book)中定义了一片CD-ROM包含了333,000个Sectors,而每个Sector又包含了2,352个Bytes。2,352 Bytes中的2,048Bytes是用来存放用户数据(User Data)的,剩下的304 Bytes则分别是同步信息(Sync), 地址指针文件头(Header), 错误修正与错误侦测码(Error Correction and Error Detection Code),这些304 Bytes的资料都是在录制CD-ROM时,由CD-R烧录器本身或录写的程序自动产生的。在标准的CD-ROM中,最前面的16个Sector(编号0到15的Sectors)是没有用到的,而Sector 16(即第17个Sector)则包含了主卷描述符(Primary Volume Descriptor),接下来是任意数目的次卷描述符(Secondary Volume Descriptor),最后则是终结卷描述符(Set Terminator Volume Descriptor). 在符合ISO 9660规格的CD-ROM中,PVD永远位于第17个Sector (Sector 16)中,且此Sector的开头字符串一定是"CD001"。El Torito的规格加了两项数据记录于CD-ROM中,分别是引导记录(Boot Record)与引导目录(Boot Catalog)。Boot Catalog则包含了五项数据记录分别是:验证入口(the Validation Entry), 初始/默认入口(the Initial/Default Entry),扇区头(the Sector Header), 段入口(the Section Entry)与段延伸入口(the Section Entry Extension)。
图一: Sector 17的内容
OFFSET 34816, HEX 8800
00008800 00 43 44 30 30 31 01 45 - 4C 20 54 4F 52 49 54 4F .CD001.ELTORITO
00008810 20 53 50 45 43 49 46 49 - 43 41 54 49 4F 4E 00 00 SPECIFICATION..
00008820 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00008830 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00008840 00 00 00 00 00 00 00 14 -
      
El Torito将一个引导记录卷描述符(Boot Record Volume Descriptor)存放在Sector 17,利用ISO 9660标准使得CD-ROM包含多个Volume Descriptor,而Boot Record Volume Descriptor就相当于ISO 9660 CD-ROM中的Secondary Volume Descriptor。在Boot Record Volume Descriptor中的CD001字符串代表了这片光盘是一片ISO 9660 CD-ROM,而EL TORITO SPECIFICATION的字符串则代表了这片CD-ROM有可以开机的功能。至于Boot Catalog则没有硬性规定要存放在特定的Sector中,Sector 17中有指标指出Boot Catalog的位置,如图一,第4行的Byte 7值14,就是代表Boot Catalog存放在第21个(十进制20,十六进制14)的地址。而事实上这个位置的指针值是可以被修改的。
图二: Sector 20的内容
OFFSET 40960, HEX A000
0000A000 01 00 00 00 41 64 61 6D - 27 73 20 41 56 20 53 74 ....Adam's AV St 
0000A010 75 64 69 6F 00 00 00 00 - 00 00 00 00 3A 67 55 AA udio........
0000A020 88 02 C0 07 00 00 01 00 - 15 
      
在Boot Catalog存在的Sector中有五个输入数据记录,就阳春的Bootable CD-ROM而言,只包含了前两个,也就是the Validation Entry及the Initial/Default Entry,The Validation Entry永远是Boot Catalog中的第一个记录,这个记录确认了这片CD-ROM有一个开机目录,除此尚保留部份空间供作者记录身份资料之用。如图二,在这个Sector的第一个Byte的值必然是01,01这个值代表了这片光盘开机目录的存在,第二个Byte则指出此片光盘意欲在何种平台上使用,举例而言,00代表80x86的平台,01代表Power PC的平台,02则代表Macintosh的平台。余下的Byte则可以让制作者用来存放身份ID之用,但第二行的第14与15个byte除外,这两个byte必需分别永远是55与AA。
       The Initial/Default Entry则指出此光盘是否为可开机型式,或是仿真何种开机的媒体型式,再来就是有多少Sectors是用来存放开机的可引导映像(Bootable Image)的,以及映像文件存放的起始位置。
       在第三行的第一个Byte 88指出此光盘片是否可开机。第二个Byte如果是04则代表此开机光盘是仿真硬盘的开机,02则代表仿真1.44MB的软盘开机。就大部份的应用程序而言,07 C0代表了标准的载入区段Load Segment。至于15则意谓Bootable的映像数据的起始位置是在Sector 15h的地方,从十进制来讲,就是Sector 21的地址。另外Default Entry的用意是用来给作者参考用的辩识数据。

    原文作者:charleyhuman
    原文地址: https://blog.csdn.net/charleyhuman/article/details/628472
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。