jenkin swindows启动_windows启动过程

展开全部

认真看完这个也许你会有收获的:

Windows启动e68a84e8a2ad62616964757a686964616f31333231626165过程介绍

相信不少人碰到过装了个什么东西之后,重启Windows就发现起不来了。所以,想把Windows启动过程中作了些什么事情,分哪些stages做个介绍。

这里要介绍的是Windows 2k/xp/2k3系列的启动过程,nt系列么,很类似。

虽然Windows是非开源的(废话!:o ),不过还是有不少资料可以参考的,还包括MS的那些public的symbol。如果有机会可以试试Kernel的live debug,那么相信还是能看到不少东西的。不过话说回来,这事情我也没做过…… 等回头自己机器上装好VMWare之类的,再Try吧,到时候会把过程记录下来贴到这里的。

Windows的启动过程么,主要包括以下几个部分:

1. Master Boot Record (MBR)

2. Boot sector

3. Ntldr (这个可能有人会觉得眼熟,是不是碰到过启动的时候说找不到Ntldr呢?;) )

4. Ntoskrnl.exe

5. Smss

6. Winlogon

7. Service control manager (SCM)

OK。

我将在这个帖子里依据上述的启动过程,对这些组件逐个介绍。当然,这里面大部分内容来自于《Inside Windows 2000》和《Windows Internals》这两本书的相应章节(Startup and shutdown)。我能做的事情基本上就是翻译和复述了,最多可能加上一些相关的注释。

当然,如果看过关于linux启动过程源码(分析)的朋友,估计会不满足于下面介绍这么点内容,而且这里也基本不谈到硬件相关的部分(最多可能仅补充一些我知道的硬件相关内容),谁叫咱看不到源码呢,呵呵。

欢迎大家进行讨论和补充。

p.s. 今天仅仅先占个位子,具体内容么,且听下回分解。:cool:

-----------------------------------------------------------------------------------------------------------------------

1. MBR & Boot Sector

物理硬盘是以扇区(sector)为单位来寻址的。Windows的安装程序会在安装的时候,将一些内容写入你

安装系统的那个硬盘的第一个扇区。这块内容就称为Master Boot Record(MBR).

MBR包括两块内容:

(1). Boot code;

(2). Partition table;

Boot code,也就是启动代码。这段代码是在系统启动的时候,BIOS完成了自检过程,选择了启动设备(

也就是你某个硬盘),然后就将该磁盘的MBR读入内存,并且跳转到MBR所在地址,从而执行其Boot code.

Partition table,也就是分区表。该表只有4项(entry),因为MS的OS允许一个磁盘最多被分为4个主分

区(primary partition)。这里的分区表里面的内容就是这4个分区的相关信息,包括其起始的sector,

相应的标志等等。

对于启动过程而言,MBR的boot code会搜寻这个分区表,在其中查找带有可启动标志(也称为Active)的

分区,然后将该分区的第一个sector(也就是Boot sector)读入,并且执行其中的代码。

在安装程序写入Boot sector之前,需要获知其所在分区的文件系统类型(FAT? FAT32? NTFS?),然后写

入不同的Boot sector。为什么对于不同的文件系统需要不同的Boot sector呢?原因在于Boot sector的

任务,就是要载入OS的系统启动文件,而载入文件的过程,是需要文件系统参与的,所以对应于不同的文

件系统,在Boot sector里面就需要不同的文件系统支持代码,以次来完成系统文件的加载。对于Windows

启动而言,需要加载的文件为Ntldr。

需要补充的是,boot sector里面对于文件系统的支持代码是“最小化”了的。毕竟boot sector的大小最多

也就只有512 bytes,要带有完整的文件系统是不大可能的。而且,我们的需求也很简单,只需要它能够

理解该文件系统,并且能够读取其中的文件就可以了,我们并没有写入文件的需求。

Boot sector将Ntldr加载完成之后,就跳转到Ntldr的入口处,接下去的任务,就交给Ntldr了。这时候,

系统还是运行在16位的实模式下,Ntldr会开启Paging,并转入32为保护模式。

这个过程中,可能碰到的错误信息是下面这个:

对于NTFS文件系统,"BOOT: Couldn't find NTLDRP";

对于FAT文件系统,"NTLDR is missing";

这个错误的意思是Boot sector在分区的根目录下没有找到Ntldr。

-----------------------------------------------------------------------------------------------------------------------

2. NTLDR

NTLDR是一个“中间人”,在Boot Sector转入NTLDR的时候,系统处于实模式下,这时候程序访问的任何地址都是实地址,也就是物理地址(虽然这其中还有80x86最基本的分段功能,学过这个实模式汇编的应该知道),并且,这个地址范围也受限在1M(20位地址)以内。所以,进入NTLDR后最先要做的事情就是转入保护模式,以便于能够完全访问32位地址范围。不过,由于此时没有设置好相应的页表,所以,还不能进行虚实地址转换(也就是还没有分页的功能)。

NTLDR需要初始化一定的页表,然后开启分页。这时候,系统已经进入了Windows的标准状态(保护模式+分页)。前面说到转入保护模式的时候,漏说了一个事情,就是初始化GDT和IDT。这里面,关键的是Windows使用的是Flat Memory Mode,也就是其保护模式下,所有段的基地址都一样。这点和其内存管理的机制息息相关,这边就先提一下。

虽然系统已经进入了保护模式,不过,此时的NTLDR还需要依赖一些BIOS调用,来访问磁盘以及显示系统。如果磁盘是SCSI的,而BIOS调用无法访问此类磁盘,那么NTLDR就加载Ntbootdd.sys来替代boot code中的磁盘访问代码。NTLDR和Boot Sector类似,也包含了NTFS和FAT文件系统的只读代码,区别么,其稍有进步,就是能访问子目录了。

由于从Windows2000开始,都有了“休眠”(Hibernation)这种关机方式。于是,NTLDR需要检查系统上是否存在有效的 Hiberfil.sys文件,如果有,那么表明最近一次关机是以“休眠”的方式关机的。于是,NTLDR就开始走“捷径”:读入 Hiberfil.sys文件,然后直接跳转到内核中“唤醒休眠”的代码,从而启动计算机。

正常启动的情况下,NTLDR读入boot.ini文件。如果该文件表明有多个可启动选项,于是就显示启动菜单,供用户选择。

这里又有一个可能的例外,虽然现在这个可能性已经很小了。这个例外就是有DOS的启动选项(包括Win9x和ME系列)。这个情况下,NTLDR 加载 Bootsect.dos文件,转回实模式,并且跳转到该文件中的MBR代码。这时候,就和最开始启动的状态(读入MBR)一样了,从而启动相应的OS。

在用户选择了启动菜单后,NTLDR还要根据该项的参数做一些相应的操作。对于这些参数么,这里就不作说明和解释了。

然后我们继续往下走...

NTLDR加载并执行Ntdetect.com。该程序是一个16位保护模式的程序,通过BIOS调用,获取系统硬件的信息(比如总线类型啊,系统时间啊,磁盘驱动器啊,并口串口啊等等),然后将这些信息集中起来,返回给NTLDR,并且这些信息在启动的后期会保存到注册标的HKLM\ HARDWARE \DESCRIPTION下。

貌似上面的这些工作都是在后台做的,除了那个可能出现的启动菜单外,其他工作都是用户看不到的。嗯,接下来,就该给用户一些反馈信息了。

NTLDR先清屏,然后显示“Starting Windows”和进度条。这里,2000和XP/2003有所不同。2000会显示黑白屏的进度条,这时候屏幕上还没有Windows的logo。而 XP/2003会显示带有Windows logo的彩屏进度条(哈哈,啥都流行彩屏啊)。需要注意的是,NTLDR在开始加载任何“启动驱动”(boot driver)之前,进度条一直是空的。

还有大家可能注意到过的,就是在显示“Starting Windows”的时候,下面还会显示“For troubleshooting and advanced startup options for Windows, press F8.”,然后进度条出现并开始滚动(前进)的时候,就没有机会按F8来进入安全模式之类的了。其实想象,这里面还是有原因的。因为在系统开始加载驱动之前,主要做的事情只是加载内核文件和注册表的System hive。这两个事情和安全模式之类的其他启动方式没有关系,无论是安全模式还是标准启动,都需要加载这两部分东西。而安全模式和标准模式的区别,在于其加载的驱动有所不同。所以,一旦Windows开始加载那些boot driver之后,就无法在改变模式了。

在NTLDR从显示“Starting Windows”开始,需要经过以下步骤:

1. 加载正确的内核以及HAL(默认为Ntoskrnl.exe和Hal.dll)。如果NTLDR在加载这两个文件的过程中出错,无法完成加载,那么会显示下面这条出错信息:Windows could not start because the following file was missing or corrupt,并且会告诉你无法加载的文件名。

2. 从\Windows\System32\Config\System读入System hive。

注:hive是指一个包含了注册表中某个子树的文件。

3. 在System hive中找出所有的boot driver(这类driver的start值为0,即SERVICE_BOOT_START)。系统的所有driver都在注册表的HKLM\ SYSTEM\CurrentControlSet\Services下面有对应的子键(subkey)。

4. 加载boot drivers所在分区的文件系统驱动,以便于之后的boot driver的加载。

5. 加载boot drivers。这时候,才会开始更新屏幕上的进度条。对于Windows 2000来说,就是那个黑白进度条。

6. 设置CPU寄存器,并且跳转到Ntoskrnl.exe的入口。

好啦,NTLDR的任务总算完成了,接下去就全部交给Ntoskrnl了。当然,在转交控制权的时候,自然也将对方需要的信息(包括内存布局,硬件信息,System hive等)也都交给Ntoskrnl,这样,NTLDR才完成了它的使命

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言让电脑发出滴滴声代码,centos命令行控制电脑发出滴滴声——使用beep把警告变为music...

需要先安装beep命令&#xff0c;在ubuntu中可使用apt-get install beep进行安装&#xff0c;在centos中需要先安装repoforge源&#xff0c;然后才使用yum install -y beep进行安装。repoforge源安装后便可进行beep的安装&#xff1a;[rootlocalhost ~]# modprobe pcspkr[rootlo…

如何让代码更易于维护_易于使用的单位和集成代码

如何让代码更易于维护此示例说明如何使用Maven和Sonar为单元和集成测试生成覆盖率。 它使用非常简单的技术&#xff0c;只需10-15分钟即可在任何现有的Maven构建中运行。 它可以用于单元&#xff0c;集成&#xff0c;ATDD或任何其他类型的测试套件。 覆盖率结果显示在声纳中。 …

cascade sqlite 数据库_ON DELETE CASCADE无法正常工作在ios中的sqlite3中

通过启用pragma foreignkeys ON,我以编程方式在ios中创建了一个.sqlite文件NSFileManager *theFileManager [NSFileManager defaultManager];if ([theFileManager fileExistsAtPath:[self getDatabasePath]] NO){char *theError;const char *databasePath [[self getDatabas…

调试 ASP 程序脚本

调试 ASP 脚本 无论您的计划多么精密、经验多么丰富&#xff0c;脚本错误 (bug) 可能在最初就使您的 ASP 服务器端的脚本无法正确运行。也就是说调试&#xff0c;即查找和纠正脚本错误&#xff0c;对开发一个成功的和强健的 ASP 程序是非常重要的。 Microsoft 脚本调试工具 Mic…

C语言用循环写出新年祝福语图案,非常漂亮的新年祝福!C语言实现漂亮的烟花效果...

本文实例为大家分享了C语言实现漂亮的烟花效果展示的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下程序名称&#xff1a;祝福烟花&#xff0c;祝福朋友编译环境&#xff1a;VC6.0 && easyx(立冬版)#include #include #include #include #include #include #…

用Java和Python模仿Kotlin构建器

介绍 Kotlin可能现在是我最喜欢的语言&#xff0c;并且它可能提供的最酷的功能之一是基于几个功能构建的类型安全的生成器&#xff08;稍后解释&#xff09;。 我发现自己真的很想在其他两种主要语言&#xff08;Java和Python&#xff09;中使用此功能。 本文解释了我认为与使用…

python刷阅读_通过python+selenium3实现浏览器刷简书文章阅读量

准备工作下载python&#xff0c;本文以python3.6为例。python3.6下载地址&#xff1a;python3下载地址&#xff0c;选择合适的版本安装。安装成功后&#xff0c;打开命令提示符&#xff0c;在其中输入python&#xff0c;显示如下信息&#xff0c;则说明安装成功。C:\Users\Ubun…

【原】移动web资源整理

2013年初接触移动端&#xff0c;简单做下总结&#xff0c;首先了解下移动web带来的问题 设备更新换代快——低端机遗留下问题、高端机带来新挑战浏览器厂商不统一——兼容问题多网络更复杂——弱网络&#xff0c;页面打开慢低端机性能差——页面操作卡顿HTML5新技术多——学习成…

android的md动画,Android-notes/动画体系详解.md at master · drs0214/Android-notes · GitHub

Android 动画详解&#xff1a;属性动画、View 动画和帧动画在 Android 中&#xff0c;基本的动画共有三种类型&#xff1a;View 动画&#xff1a;也叫视图动画或者补间动画&#xff0c;主要是指 android.view.animation 包下面的一些类&#xff0c;只能被用来设置给 View&#…

蓝桥杯省赛考点_【蓝桥杯单片机01】从历年决赛真题中寻找单片机常见的考点...

【蓝桥杯单片机01】从历年决赛真题中寻找单片机常见的考点广东职业技术学院 欧浩源【第三届&#xff1a;门禁系统】1、功能简述“门禁系统”主要有两种工作模式&#xff1a;模式1&#xff1a;7&#xff1a;00&#xff5e;22&#xff1a;00为自动门状态&#xff0c;该状态下门的…

android 5.0 新功能,Android 5.0新特性有哪些?安卓5.0新功能汇总

Android 5.0新特性有哪些&#xff1f;经过一段时间曝光与测试后&#xff0c;期待已久的Android L系统正式发布了&#xff0c;新一代安卓系统正式名称为Android 5.0 Lollipop(棒棒糖)。Android 5.0新特性有哪些呢&#xff1f;下面&#xff0c;由百事网小编盘大家盘点一下安卓5.0…

cks子,间谍,局部Mo子和短管

本文是我们名为“ 用Mockito进行测试 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入了解Mockito的魔力。 您将了解有关“模拟”&#xff0c;“间谍”和“部分模拟”的信息&#xff0c;以及它们相应的Stubbing行为。 您还将看到使用测试双打和对象匹配器进行验证的过…

[Android] websocket客户端开发

为了能够在H5和APP都保持同一套长连接接口&#xff0c;因为采用websocket协议作为开发 使用的第三方库是&#xff1a;https://github.com/TakahikoKawasaki/nv-websocket-client 一开始在本地开发的时候&#xff0c;就遇到问题了&#xff0c;总是连接不上 WebSocketFactory fac…

8数据提供什么掩膜产品_工业轨式1-8路RS485数据(MODBUS RTU协议)厂家产品说明...

产品描述工业级数点对点光猫提供1-8路RS485&#xff08;MODBUS RTU协议&#xff09;&#xff1b;在光纤中传输&#xff0c;该产品突破了传统串行接口通讯距离与通讯速率的矛盾&#xff0c;同时&#xff0c;也解决了电磁干扰、地环干扰和雷电破坏的难题&#xff0c;大大提高了数…

BZOJ 4568 倍增维护线性基

在树的路径上选取一些点 使得这些点权xor后的结果最大 思路&#xff1a; 时限60s 59696ms卡过去了哈哈哈 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N20005; ll T…

eureka 集群失败的原因_eureka集群中的疑问?

题主的问题描述太绕了&#xff0c;我们先把集群中的角色定义下&#xff1a;Eureka架构比较细节的架构图如下所示&#xff1a;在配置多个EurekaServer的Service Provider&#xff0c;每次Service Provider启动的时候会选择一个Eureka Server&#xff0c;之后如果这个Eureka Serv…

代码android点击效果,GitHub - likaiyuan559/TouchEffects: Android View点击特效TouchEffects,几行代码为所有控件添加点击效果...

Android 点击特效TouchEffectsTouchEffects能够帮助你更快速方便的增加点击时候的效果&#xff0c;TouchEffects的目标是打造一个稳定、全面、且能更方便的自定义及个性化的一款点击效果框架。功能特点&#xff1a;只需要几行代码便能为全局的View加上点击效果支持多种点击效果…

apache shiro_Apache Shiro第2部分–领域,数据库和PGP证书

apache shiro这是致力于Apache Shiro的系列文章的第二部分。 我们从简单的不安全Web应用程序开始了上一部分 。 完成后&#xff0c;该应用程序具有基本的身份验证和授权。 用户可以登录和注销。 所有网页和按钮均已分配并实施了访问权限。 授权和身份验证数据都已存储在静态配置…

nginx 上传文件漏洞_文件上传及解析漏洞

注:本文仅供学习参考文件上传定义:文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马&#xff0c;病毒&#xff0c;恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的&#xff0c;部分文件上传漏洞的利用技术门槛非常的低&…

Linux下暴力破解工具Hydra详解

Linux下暴力破解工具Hydra详解 一、简介 Number one of the biggest security holes are passwords, as every password security study shows. Hydra is a parallized login cracker which supports numerous protocols to attack. New modules are easy to add, beside that,…