(转)Windows启动过程分析-预引导

标 题: 【原创】Windows启动过程分析-预引导
作 者: EvilKnight
时 间: 2012-01-11,17:31:17
链 接: http://bbs.pediy.com/showthread.php?t=145414

很早很早以前分析的了,一直没有发出来,有兴趣的同学就看看吧,木有兴趣的就跳过了...纯科普文章......只写了MBR部分,以后有时间的话把后面的也写完吧..

引言:
本文旨在以Windows XP为例分析其系统的引导祥细过程,以期较为深入的揭示引导过程。连载中….

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

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

预引导:
       这个过程就是当用户按下电源开关进行冷启动所要完成的各种初始化工作,在这文档中,并不打算很祥细的讲解硬件方面的初始化,如果读者有兴趣的话,可以查阅相关资料,我觉得 《电脑及操作系统的启动过程》这个还是不错的。
名称:  3.jpg
查看次数: 259
文件大小:  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
查看次数: 243
文件大小:  32.4 KB


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

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

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

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


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


名称:  8.jpg
查看次数: 256
文件大小:  90.5 KB
       这一段为错误显示,显示完之后死循环。

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

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

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

ReadSectors:

名称:  12.jpg
查看次数: 259
文件大小:  136.7 KB

       这段代码是取得磁盘参数,如果失败的话,跳去StandardRead,否则判断引导分区的地址是否大于通过int 13h获取到的地址,这个意味着是否需要调用扩展int 13h来读扇区。



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



       这段代码检查扩展功能是否存在。



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



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

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

其实还要感谢科锐的钱老师和方老师,引我们入门了。当时在科锐的文件系统也是方老师讲的...非常牛逼的...

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

预引导.rar[谁下载?]

posted @ 2012-01-13 11:21  MayFirst  阅读(356)  评论(0编辑  收藏  举报