Windows启动过程分析-预引导

来源:互联网 发布:电信卡怎么设置4g网络 编辑:程序博客网 时间:2024/06/08 16:59

原文地址:http://bbs.pediy.com/showthread.php?t=145414
本文旨在以Windows XP为例分析其系统的引导祥细过程,以期较为深入的揭示引导过程。连载中….

启动过程:
操作系统的引导一般可以分为五个过程:预引导、引导、内核加载、内核初始化和系统登陆五个阶段。
名称:  1.jpg查看次数: 2031文件大小:  18.7 KB
图一
表一则列出了在系统引导的不同阶段所引用的文件。
名称:  2.jpg查看次数: 2038文件大小:  67.7 KB

注:以上部分是引用《Windows2000系统引导过程详解》的,非常感谢作者的劳动成果。

预引导:
这个过程就是当用户按下电源开关进行冷启动所要完成的各种初始化工作,在这文档中,并不打算很祥细的讲解硬件方面的初始化,如果读者有兴趣的话,可以查阅相关资料,我觉得 《电脑及操作系统的启动过程》这个还是不错的。
名称:  3.jpg查看次数: 2027文件大小:  32.8 KB
MBR(Main BootRecord):
好了,我们跳过加电自检,继续,当计算机完成了加电自检之后,系统BIOS根据用户配置的指定顺序从相关的介质启动,当然,我们这里分析的是硬盘的。计算机就会检查磁盘的第0磁道0磁头1扇区,如果发现它以0xAA55结尾,则BIOS认为它是一个引导扇区(所以主引导扇区位于整个硬盘的0磁道0磁头1扇区),然后将这512B的内容加载到内存0000:7c00处执行。
Windows操作系统获得控制权应该就是从这里开始的吧,一般MBR是在WindowsSetup程序在安装Windows时填充的。
其实主引导记录的作用就是检查分区表是否正确以及判别哪个分区为可引导分区,并在程序结束时把该分区的启动程序(也就是操作系统引导扇区)调入内存加以执行。
在真正开始看MBR的代码时,我们先来了解一下MBR的结构。
名称:  20.jpg查看次数: 832文件大小:  28.8 KB


如图:
名称:  4.jpg查看次数: 842文件大小:  186.8 KB
上面提到了Windows磁盘签名,这里讲解一下,Windows磁盘签名是Windows系统在对硬盘做初始化时写入的一个标签,它是MBR扇区不可或缺的一个组成部分。Windows系统依靠这个签名来识别硬盘,如果硬盘的签名丢失,Windows系统就会认为该硬盘没有初始化。
我在Windows XP sp2上尝试将磁盘签名清除,当系统重新启动时,会提示系统设置改变。有兴趣深入了解的读者可以可以翻阅《数据安全与编程技术》。

因为MBR代码部分会对DPT(分区表)进行解析,所以这里再讲一下DPT的结构:
名称:  21.jpg查看次数: 2003文件大小:  86.9 KB

看到上面这表,可能读者会问,为啥用了10位来记录柱面号呢?
其实这是历史问题了,早期的硬盘是通过磁头、柱面、扇区对硬盘进行访问的,磁头数表示硬盘总共有几个磁头,也就是有几张盘,最大为255(刚好一个字节可以存下,8位),柱面数表示硬盘每一面盘片上有几条柱面,最大为1023(10位了),扇区数表示每一条磁道上有几个扇区,最大为63(6位)。

MBR代码分析:
名称:  5.jpg查看次数: 2008文件大小:  86.6 KB
这一段代码实现了将内存中的MBR搬到安全的内存地址处,并通过push以及retf指令实现跳转,将执行权交给MBR继续执行。不过这里做了一个小小的优化,没有将当前正在执行、且以后用不到的这个入口函数给优化掉了,在拷备的过程中没有进行拷备。

点击图片以查看大图图片名称:6.jpg查看次数:2015文件大小:102.9 KB文件 ID :63900
这段代码对分区表进行检测,检测到某分区表项引导标识符小于0。小于0的话跳去CheckAnother,大于0的话跳去CannotBoot。因为前面的表格已经说明了,引导标识符只能为00H或80H,在这里80H其实是负数,所以如果标识符为80H的话,走的是上面CheckAnother分支。如果四个分区项的标识符都为0的话,就调用int 18H,跳入ROM BASIC。


名称:  7.jpg查看次数: 1998文件大小:  47.6 KB
这段代码的作用是检查另外的分区表项,其余表项必须为非引导的,否则显示错误信息Invalid partition talbe,然后就死循环了(显示错误信息是下段代码)。


点击图片以查看大图图片名称:8.jpg查看次数:2003文件大小:90.5 KB文件 ID :63902
这一段为错误显示,显示完之后死循环。

名称:  9.jpg查看次数: 2021文件大小:  188.4 KB
这段代码调用ReadSectors函数将相应的分区引导扇区的内容读进内存,这里有对FAT32以及FAT32(LBA)分区做处理。如果最终还是失败的话,跳去上面OutputErrorInformation处,输入Invalid partition table错误信息。成功的话接着判断结束标识。

名称:  10.jpg查看次数: 1983文件大小:  43.7 KB
这段代码判断结束标识是否正确,成功的话走去GoToDBR处,失败的话先判断之前有没有针对FAT32分区做过处理,没有的话跳去IsFAT32Partition,如果之前已经有试过的话,跳去OutputErrorInformation输出Invalid partition table错误信息。

名称:  11.jpg查看次数: 1972文件大小:  18.2 KB
这段代码通过push、retf的形式将控制权转去DBR处。

ReadSectors:

点击图片以查看大图图片名称:12.jpg查看次数:807文件大小:107.3 KB文件 ID :64298
这段代码是取得磁盘参数,如果失败的话,跳去StandardRead,否则判断引导分区的地址是否大于通过int 13h获取到的地址,这个意味着是否需要调用扩展int 13h来读扇区。



点击图片以查看大图图片名称:13.jpg查看次数:1950文件大小:94.6 KB文件 ID :63907
这段代码是标准的读,调用传统的int 13h去读扇区,将扇区内容读进0000:7c00中去,如果失败了,会再重试四次。成功了直接跳到这个函数尾部,返回。


点击图片以查看大图图片名称:14.jpg查看次数:1936文件大小:122.8 KB文件 ID :63908
这段代码检查扩展功能是否存在。



点击图片以查看大图图片名称:15.jpg查看次数:1931文件大小:89.7 KB文件 ID :63909
这段代码调用扩展读去读扇区内容至7c00中,如果失败,接着再重试四次。



名称:  16.jpg查看次数: 1915文件大小:  24.7 KB
到此,就完全分析完了…

DBR:
引导扇区中的代码随硬盘文件系统格式的不同而有所不同,其职责是,给windows提供有关该硬盘上卷结构和格式方面的信息,并且从该卷的根目录中读入windows的加载程序,即ntldr文件;然后将控制权交给ntldr的入口函数。为了能够从根目录中读入加载程序,引导扇区包含了能理解文件系统结构和读取文件的代码,这通常只是文件系统极其简单的一部分功能,而并非完整的实现。
参考文献:
Win 2000系统引导过程详解
数据安全与编程技术 作者:涂彦晖戴士剑
自己动手写操作系统
Windows内核原理与实现
深入浅出硬盘分区表 作者:武汉市中国地质大学 印涛,秦剑

其实还要感谢科锐的钱老师和方老师,引我们入门了。当时在科锐的文件系统也是方老师讲的...非常牛逼的...
同时还有感谢看雪论坛的hzHC、justto、代码疯子、NutCracker给予的帮助以及各位网友的支持。


idb文件在家,不在公司,文档直接在这里发了,要idb文件到 http://www.newexe.com/read.php?u=9&tid=110 下载吧,我就不一一更新了...