Windows启动过程详解

16d310127b33b817393a7ce5e487f3d8.png

我们每天都在和Windows打交道,很多人可能每天都要面对多次Windows的启动过程,可是您知道在Windows的启动过程背后,隐藏着什么秘密吗?在这一系列过程中都用到了哪些重要的系统文件?系统的启动分为几个步骤?在这些步骤中计算机中发生了什么事情?这些就是本文试图告诉您的。

d394d4f79185cf60a8c1e7625894c45b.png

随着技术的发展,我们能够见到的计算机硬件种类越来越多。以计算机上最重要的组件CPU来说,目前就有很多选择。当然,这里的选择并不是说AMD或者Intel这种产品品牌,而是指其内部的体系结构。目前常见的CPU体系结构主要基于复杂指令集(Complex Instruction Set Computing,CISC)或者精简指令集(Reduced Instruction Set Computing,RISC),我们常用的Intel的Pentium、Celeron系列以及AMD的Athlon、Sempron系列都是基于复杂指令集的,而这些基于复杂指令集的CPU还有32位和64位的寄存器数据带宽区别。关于这些指令集以及寄存器数据带宽之间的区别等内容比较繁杂,而且不是本文的重点,感兴趣的朋友可以自己在网上搜索相关内容。因为CPU种类的不同,在不同CPU的系统中运行的Windows的启动过程也有一些小的不同。

8a7a9e6b676df4887e478dc5e62d97a7.png

基本上,操作系统的引导过程是从计算机通电自检完成之后开始进行的,而这一过程又可以细分为预引导、引导、载入内核、初始化内核,以及登录这五个阶段。

系统引导的不同阶段所引用的文件如下:

ad2e2a138436c813c3a6579e2529e190.png


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

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

d03b116b67f10f9aabebcf58ac99f607.png

如图:

87344887c3c6bfd65f96181713ada25d.png

  上面提到了Windows磁盘签名,这里讲解一下,Windows磁盘签名是Windows系统在对硬盘做初始化时写入的一个标签,它是MBR扇区不可或缺的一个组成部分。Windows系统依靠这个签名来识别硬盘,如果硬盘的签名丢失,Windows系统就会认为该硬盘没有初始化。
  因为MBR代码部分会对DPT(分区表)进行解析,所以这里再讲一下DPT的结构:

bd952ef8adc5422bc560c23b1b1233bb.png

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

MBR代码分析:

3cec18db5790ab2f42cd85f43b2ed9ac.png

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

35a07c868d9da106c9ab40c46bf5cca9.png

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

2a765a5118e4f91e7b277e43cbbe5013.png


DBR:
引导扇区中的代码随硬盘文件系统格式的不同而有所不同,其职责是,给windows提供有关该硬盘上卷结构和格式方面的信息,并且从该卷的根目录中读入windows的加载程序,即ntldr文件;然后将控制权交给ntldr的入口函数。为了能够从根目录中读入加载程序,引导扇区包含了能理解文件系统结构和读取文件的代码,这通常只是文件系统极其简单的一部分功能,而并非完整的实现。

✨✨ 欢迎关注 ✨✨

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值