接下来我们把目光转移到操作系统引导扇区上,即操作系统所在分区的第一个扇区。操作系统引导扇区与操作系统密切相关,其主要功能就是,在操作系统分区上,找到引导操作系统内核相关的文件,完成操作系统的加载。这里说的“引导操作系统相关的文件”,既可能是操作系统核心模块,也可能是为进一步引导操作系统核心模块而作准备的一些可执行代码。毕竟现代操作系统十分复杂,核心模块很大,无法直接完成引导。这样就可能有一些辅助的引导模块,毕竟引导扇区代码的功能是十分有限的。
但不论如何,引导扇区的代码必须在操作系统所在分区的文件系统里找到一个模块(实际上是一个文件),并加载到内存。因此下列两项功能是引导扇区代码的核心:
(1)在分区的文件系统上,找到一个特定文件。
(2)把这个文件装入内存,并跳转执行。
第二项工作比较容易,一般情况下,引导扇区还是运行在CPU的实模式下(以PC为例),可以调用BIOS提供的磁盘读写服务,很容易把文件读入内存。关键是第一项工作,如何在一个文件系统里搜索到一个特定的文件。实际上“搜索到一个文件”也不是关键,关键是如何以“一个扇区”的代码、在一个复杂的文件系统里找到一个需要的文件。这里的两个因素,形成一对矛盾:
(1)引导扇区代码尺寸有限,比如只有512B,无法适应复杂的处理要求。
(2)文件系统结构复杂,访问文件系统所需要的代码量很大,一个扇区无法容纳。
引导扇区需要很好地平衡这对矛盾,以便引导过程能够继续。一般情况下,有下列几种方式解决这个问题。
(1)扩展引导扇区大小。一般认为,操作系统引导扇区是512B,操作系统的初始引导完全是由这512B代码完成的。实际上不然,很多操作系统,比如Windows,已经大大扩展了引导扇区尺寸。既然整个分区都是操作系统的地盘,那么每个扇区怎么使用,就完全由操作系统决定了。引导扇区是分区的第一个扇区,这个不能变。那么完全可以把第二个、第三个……第N个扇区也作为引导扇区。第一个扇区只是作为跳板,MBR把第一个扇区读入内存并运行后,第一个扇区再把后面连续的一片扇区读入内存,这些所有的扇区共同组成引导模块。这样无论文件系统多么复杂,只要多分配几个扇区,就可以容纳访问文件系统的代码了。显然,这种方式很有效,且被广泛采用。比如Windows操作系统,在NTFS文件系统上的引导扇区,就有16个(0~15号扇区),有8KB的代码空间。这对分析NTFS文件系统并读取引导文件(比如NTLDR),就足够了。(www.xing528.com)
(2)引导扇区维持一个不变,但是固定操作系统核心或相关文件在磁盘上的位置。操作系统可以把引导相关的文件固定在磁盘的一个特定位置上,比如1024号扇区位置处。这样引导扇区就无需分析文件系统了,直接从1024号扇区处读取操作系统核心就行了。这种策略在DOS时代似乎被用过。记得我在上大学的时候,制作了一张DOS启动软盘,上面有IO.SYS等文件。有一次把IO.SYS文件删除了,重新复制了一个进去,结果就不能启动DOS了。据此推测,DOS可能把IO.SYS等固定在了软盘的某个位置。一旦删除再复制,其位置变化了,就导致不能引导。
上述两种解决方案都有局限。第一种方案,在一个分区上只安装一个操作系统,或者安装相同软件厂商的不同操作系统时是有效的,但如果安装两个不同厂商的操作系统,则可能就会有问题。假设操作系统A和B都使用的是第一种策略,A先安装到分区上。在第二个操作系统B安装的时候,为了能同时引导A系统,B会把A的引导扇区(第一个扇区)备份到一个文件里(比如Windows系统下的BOOTSECT.DOS),然后把自己的引导扇区(可能连续几个)写入分区的开始处。这样A操作系统的第一个以外的引导扇区,都被B覆盖了。显然,这时候是无法再次引导A系统的。但是如果A和B是同一个软件公司的产品,比如Windows 98系列和Windows 2000/XP系列,由于都是微软开发,对引导扇区的结构和数量都是已知的,这样在Windows 98上安装XP或其他更高版本的操作系统时,更高版本的系统(比如XP)就会把原有系统的所有引导扇区都统一打包到一个文件里,这样就不会出现覆盖问题。如果这种打包仍然有问题(比如第一个扇区会调用BIOS服务读取后续扇区,即使打包了,也无法改变这种动作),XP甚至会修改打包后的引导扇区文件。这里的关键就是,最新版本的操作系统,对原有版本的操作系统能够识别,并作出有效处理。
第二种方案的缺点是,需要文件系统的良好支持。比如用户固定了某个文件的位置,而且要求该位置不能变动(除非文件被删除),这样就要求文件系统不能随便改变文件位置(或者针对操作系统文件做单独处理),否则这种方法就会失效。这显然是苛刻的,结果就是,由于文件系统不能改变已有文件的位置,会导致大量的磁盘碎片产生。常用的文件系统,比如FAT、NTFS、EXT等,都不提供这种功能。因此第二种方案的应用范围非常有限。只有早期的一些操作系统会采用。目前大部分操作系统都采用第一种方案进行设计。
至此,下列一些概念或原理,读者应该已经清楚。
(1)操作系统的引导扇区可能不止一个。
(2)对于FAT32/NTFS等复杂的文件系统,需要多个引导扇区才能完全容纳引导代码。
(3)可通过固定操作系统核心文件在磁盘上的位置,来确保引导代码只占一个扇区。
(4)不同厂商操作系统很难共存于同一个分区的原因。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。