首页
社区
课程
招聘
[原创]Windows启动过程分析-预引导
发表于: 2012-1-11 17:31 47178

[原创]Windows启动过程分析-预引导

2012-1-11 17:31
47178

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

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

启动过程:
       操作系统的引导一般可以分为五个过程:预引导、引导、内核加载、内核初始化和系统登陆五个阶段。

                                                     图一
表一则列出了在系统引导的不同阶段所引用的文件。


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

预引导:
       这个过程就是当用户按下电源开关进行冷启动所要完成的各种初始化工作,在这文档中,并不打算很祥细的讲解硬件方面的初始化,如果读者有兴趣的话,可以查阅相关资料,我觉得 《电脑及操作系统的启动过程》这个还是不错的。

MBR(Main BootRecord):
       好了,我们跳过加电自检,继续,当计算机完成了加电自检之后,系统BIOS根据用户配置的指定顺序从相关的介质启动,当然,我们这里分析的是硬盘的。计算机就会检查磁盘的第0磁道0磁头1扇区,如果发现它以0xAA55结尾,则BIOS认为它是一个引导扇区(所以主引导扇区位于整个硬盘的0磁道0磁头1扇区),然后将这512B的内容加载到内存0000:7c00处执行。
       Windows操作系统获得控制权应该就是从这里开始的吧,一般MBR是在WindowsSetup程序在安装Windows时填充的。
       其实主引导记录的作用就是检查分区表是否正确以及判别哪个分区为可引导分区,并在程序结束时把该分区的启动程序(也就是操作系统引导扇区)调入内存加以执行。
       在真正开始看MBR的代码时,我们先来了解一下MBR的结构。


如图:

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

       因为MBR代码部分会对DPT(分区表)进行解析,所以这里再讲一下DPT的结构:


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

MBR代码分析:

       这一段代码实现了将内存中的MBR搬到安全的内存地址处,并通过push以及retf指令实现跳转,将执行权交给MBR继续执行。不过这里做了一个小小的优化,没有将当前正在执行、且以后用不到的这个入口函数给优化掉了,在拷备的过程中没有进行拷备。


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


        这段代码的作用是检查另外的分区表项,其余表项必须为非引导的,否则显示错误信息Invalid partition talbe,然后就死循环了(显示错误信息是下段代码)。


       这一段为错误显示,显示完之后死循环。


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


       这段代码判断结束标识是否正确,成功的话走去GoToDBR处,失败的话先判断之前有没有针对FAT32分区做过处理,没有的话跳去IsFAT32Partition,如果之前已经有试过的话,跳去OutputErrorInformation输出Invalid partition table错误信息。


       这段代码通过push、retf的形式将控制权转去DBR处。

ReadSectors:


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


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


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


       这段代码调用扩展读去读扇区内容至7c00中,如果失败,接着再重试四次。


       到此,就完全分析完了…

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

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

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

预引导.rar


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 8
支持
分享
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
 
赞赏  音货得福   +5.00 2020/03/25 吃瓜就吃瓜,不要打赏
最新回复 (56)
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
2
学习~~感谢分享~~
2012-1-11 17:53
0
雪    币: 291
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
坐等精华授权仪式....
2012-1-11 17:54
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
4
不收藏,真对不起我自己 感谢楼主,期待被"射精"
2012-1-11 18:08
0
雪    币: 380
活跃值: (108)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
很详细,学习下
2012-1-11 18:45
0
雪    币: 388
活跃值: (707)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
6
哈,谢谢楼上几位没有吐槽,在硬盘放了好久,不敢发,怕被人骂......
2012-1-11 18:58
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
只能膜拜...
坐等精华...
2012-1-11 19:07
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
8
很感兴趣 ,一直想弄这块 .....坐等连载..
2012-1-11 19:39
0
雪    币: 58
活跃值: (1130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
刚好BIOS遇到一个BUG,需要分析MBR,太及时了!!
2012-1-12 16:11
0
雪    币: 1895
活跃值: (1657)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
膜拜楼主。学习中。围观射精。
2012-1-12 16:32
0
雪    币: 10960
活跃值: (2920)
能力值: ( LV5,RANK:71 )
在线值:
发帖
回帖
粉丝
11
佩服,楼主太强悍了。
2012-1-13 08:55
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
12
4楼太邪恶,感谢楼主分享!
2012-1-13 09:11
0
雪    币: 2308
活跃值: (2200)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
13
写的真的很不错,支持了。
2012-1-13 09:53
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
14
不错不错,费心了。
2012-1-13 11:51
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
15
真是越有才越怕拍,谦虚过头啊
分析得好
2012-1-13 14:15
0
雪    币: 209
活跃值: (813)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
这篇文章貌似以前在哪里就看过啊!
有木有?
2012-1-13 16:57
0
雪    币: 1115
活跃值: (122)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
17
分析地不错,让人想起往事...
加油
2012-1-13 17:35
0
雪    币: 388
活跃值: (707)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
18
参考文献:
Win 2000系统引导过程详解
数据安全与编程技术  作者:涂彦晖戴士剑
自己动手写操作系统
Windows内核原理与实现
深入浅出硬盘分区表    作者:武汉市中国地质大学 印涛,秦剑

呵呵,很多搞技术的都不太会表达,而且像一些基础的理论性的东西我觉得就没有必要自己再用自己的语言总结一下了,前人已经总结得非常好了,所以直接用了。
像分区表那些,是总结几份资料的。
分析部分之前没有在哪看过吧?
2012-1-13 17:46
0
雪    币: 575
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
是2k的mbr吧,读取磁盘参数那块没看懂
看过一个win7 mbr的分析,分享给大家
http://www.mouseos.com/win7/mbr.html
2012-1-13 19:07
0
雪    币: 388
活跃值: (707)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
20
呵呵,谢谢了,看看。
2012-1-13 20:07
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
21
留帖。。。。
2012-1-13 22:45
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
马克下~~~~
2012-1-14 13:20
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
这也精华? 太基础了吧
2012-1-15 11:42
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
数据恢复那本书上也没楼主讲得仔细,哈哈!
2012-1-15 14:51
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
25
留帖,mbr
2012-1-15 15:55
0
游客
登录 | 注册 方可回帖
返回
//