windows启动过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows启动过程相关的知识,希望对你有一定的参考价值。
主引导记录如何读取?
如果多个系统的位置信息记录在boot.ini中,那么主引导记录执行后能解读
boot.ini吗?windows里面的文件比如autoexec.bat *.com *.exe能执行吗?
从主引导记录到进入windows系统,需要调用DOS辅助进入系统吗?
在用光盘安装windows系统时,光盘里面是不是引导了DOS系统?
Windows启动过程介绍
<序>
相信不少人碰到过装了个什么东西之后,重启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才完成了它的使命 参考技术A windows启动过程:
一、电源开启自检过程
在打开计算机电源时,首先开始电源启动自检过程。在BIOS中包含一些基本的指令,能够帮助计算机在没有安装任何操作系统的情况下进行基 本的启动。电源启动自检过程首先会从BIOS中载入必要的指令,然后进行如下一系列的自检操作: 进行硬件的初始化检查,例如检查内存的容量等。 验证用于启动操作系统的设备是否正常,例如,检查硬盘是否存在等。 从CMOS中读取系统配置信息。在完成了电源启动的自检之后,每个带有固件的硬件设备,如显卡和磁盘控制器,都会根据需要完成内部的自检操作。
二、初始化启动过程
在完成了电源启动自检过程之后,存储在CMOS中的设置,例如磁盘的引导顺序等,能够决定由哪些设备来引 导计算机。例如,可以设置磁盘的引导顺序为首先通过A盘引导,其次才通过C盘引导,则系统会首先尝试用A盘引导系统,如果A盘存在并可引导,则通过A盘引 导。如果A盘不存在,则通过C盘引导系统。如果A盘存在,但不是引导盘,则系统地提示系统不可引导。
一般来说通常会使用硬盘引导。在 进行硬盘引导时,启动过程通常按照如下的步骤进行:
系统首先检测打开电源的硬盘。若该硬盘是启动盘,BIOS就将主引导记录(Main Boot Record――MBR)中的引导代码载入内存。 接着,BIOS会将启动过程 的运行交给MBR来进行。 计算机搜索MBR中的分区表,找出活动分区(Active Partition)。 计算机将活动分区的第一 个扇区中的引导代码载入到内存。 引导代码检测当前使用的文件系统是否可用。 引导代码查找ntldr文件,找到之后启动它。 (该文件ntldr文件将来在登录进入windows系统之后C盘根目录隐藏文件下找到) BIOS 将控制权转交给ntldr,由ntldr完成操作系统的启动。
注意:这里简单介绍一下MBR的概念。MBR位于启动磁盘的第一个 扇区,其中主要包含引导代码(Boot Code)和分区表(Partition Table)数据。引导代码主要用于引导系统。而分区表则主要用于标识 基本分区和扩展分区。
三、引导程序载入过程
本过程主要由ntldr 文件完成。 Ntldr从引导分区载入启动文件,然后完成如下一些任务。
1、在基于X86CPU的系统下,设置CPU的运行使用32位的Flat 内存模式 。 对基于X86CPU的计算机来说,第一次启动的时候总是进入所谓的实模式
(RealMode)。在实模式下CPU的某些特性不能完全 发挥,这是因为它要保证同8位或16位的CPU(如8086、8088)相兼容。实模式下由于系统规格的限制,无法对大容量内存进行直接存取,而必须通过 分段的方式完成。对于32位的Windows XP来说,8位或16位的CPU显然是无用的。
ntldr首先会将CPU切换到32位的模式, 从而确保Windows XP的正常。在CPU的32位模式下,可以对大容量内存进行直接存取,而彻底抛弃了原先在8位或16位下分段存取内存的不便。这 也是为什么32位模式称作Flat内存模式的原因。
2、启动文件系统
ntldr 中包含相应的代码,能够帮助Windows XP完成对NTFS或FAT格式的磁盘进行读写。从而能够读取、访问和复制文件。
3、读取boot.ini 文件
在这一步 中,ntldr 会分析boot.ini文件,确定操作系统分区所在的位置。 对于单引导的系统来说,ntldr 会通过启动ntdetect.com来初始化硬件检测状态。
对于多引导系统来说,首先由用户在操作系统菜单中选择要启动的操作系统然后而由 ntldr进行相应的操作。
如果用户选择启动ntdetect.com来初始化硬件检测状态。 如果选择启动旧式的微软操作系统, 如MS-DOS、Windows 9x/ME,ntldr会将从bootsect.dos文件中读取MBR代码,然后将控制权交给bootsect.dos中的MBR。
4、根 据需要提供启动菜单
在这一步,如果用户按下F8键,则会显示启动菜单,允许用户选择不同的启动方式,例如使用安全方式启动,或是使用最后一次 正确的配置启动等。
5、检测硬件和硬件配置
在这一步中,ntldr 启动ntdetect.com文件进行基本的设备检查,然后将 boot.ini文件中的信息,以及注册表中的硬件和软件信息传递给ntoskrnl.exe 程序。
四、检测和配置 硬件过程
在处理完boot.ini文件之后,ntldr会启动ntdetect.com程序。在基于X86的系统 中,ntdetect.com会通过调用系统固件程序收集安装的硬件信息,然后由ntdetect.com将这些信息传递送回ntldr。Ntldr获取 从ntdetect.com发来的信息后,将这些信息组织成为内部的断气结构形式,然后由ntldr 启动ntoskrnl.exe ,并将这些信息发送给它。 Ntdetect.com 会收集如下类型的硬件信息: 系统固件信息,例如时间和日期等 总线适配器的类型 显卡适配器的类型 键盘
通 信端口 磁盘 软盘
输入设备,例如鼠标,并口 安装在ISA槽中的ISA设备 。
完成信息 的检测之后,Windows XP会在屏幕上显示那个著名的Windows XP商标,并显示一个滚动的,告诉用户Windows 的启动进程。
五、 内核加载过程
在此过程中,ntldr实施下列一些功能。
1、将内核(ntoskrnl.exe)和硬件抽象 层(hal.dll)载入到内存
2、加载控制集信息
在这一过程中,ntldr从注册表中的HKEY_LOCAL- _MACHINE\SYSTEM位置加载相应的控制集(Control Set)信息,并确定在启动过程中要加载的设备驱动。
3、加载设备驱 动程序和服务
在这一步中,系统会在BIOS的帮助下开始加载设备驱动程序,以及服务。
4、启动会话管理器
完成上面的 过程之后,内核会启动会话管理器(Session Manager),这是一个名为smss.exe 的程序,其作用表现如下:(1) 创建系统环境变量 (2)创建虚拟内存页面文件。
六、用户登录过程
在 这一过程中,Windows 子系统会启动winlogon.exe,这是一个系统服务,用于提供对Windows 用户的登录和注销的支持。Winlogon.exe 可以完成如下一些工作:
启动服务子系统(services.exe),也称服务控 制管理器(Service Control Manager, SCM)。
启动本地安全授权(Local Security Authority , LSA)过程(lsass.exe)。 在开始登录提示的时候,对Crtl+Alt+Del组合键进行分析处 理。 一个图形化的识别和认证组件收集用户的帐号和密码,然后将这些信息安全地传送给LSA以进行认证处理。如果用户提供的信息是正确的,能够通过 认证,就允许用户对系统进行访问。
要注意的是,如果您的计算机中,只有Administrator这一个用户,那么在欢迎屏幕中就会显示 Administrator 用户项。如果您的计算机中不仅有Administrator用户,还有别的可以交互登录的用户,那么欢迎屏幕中就只显示出Administrator之外 的用户,而不显示Administrator用户。 如果用户希望以Administrator用户登录,该怎么办呢?实际很简单,直接在欢迎 屏幕中按下两次Crtl+Alt+Del组合键,即可打开标准的登录窗口,可以再输入Administrator 的用户名和密码,以便用最高管理员的身份登录。
七、即插即用设备的检测过程
对即 插即用设备的检测,实际上是和登录过程异步进行的。由系统固件、硬件、设备驱动和系统特性决定了Windows XP如何对新设备进行检测和枚举。当即插即用组件正常工作后,Windows XP会对新设备进行检测,为它们分配系统资源,并在尽量不要用户提供选择的情况下,为新设备安装一个合适版本的驱动程序。 至此,Windows XP已成功启动! 参考技术B 这是什么东西呀,看这有什么实际的作用呀,又不是要发表论文,没有这么麻烦的必要吧,
怎么关闭Windows安全启动?
什么是安全启动?
安全启动(英文名为Secure Boot),是装有UEFI固件的较新PC上的一项重要安全功能,它可以保护计算机的启动过程,防止在启动过程中加载未签名的UEFI驱动程序和引导加载程序,以及阻止一些未经授权的软件,比如恶意软件。但是只有Windows 8和Windows 10具有安全启动证书,如果您需要在支持安全启动的PC上安装 Windows 7,则需要禁用安全启动。除此之外,还有一些情况需要禁用安全启动,比如您需要在PC上运行两个操作系统,使用USB或CD等外部设备在PC上启动Windows系统,使用Windows密码恢复工具启动Windows等,
需要注意的是,Windows 11需要开启安全启动才能运行,这是微软声称为用户提供安全体验的Windows 11的众多先决条件之一。因此请根据自己的实际情况决定是否要关闭安全启动。
如何关闭安全启动?
1、先进入UEFI BIOS
安全启动(Secure Boot)设置位于UEFI BIOS菜单中,若想关闭安全启动,则需要先进入BIOS。下面将介绍两种可以进入UEFI BIOS的方法。
方法1:在PC开机过程中连续快速按下特定按键进入到BIOS界面。(由于计算机或主板品牌不同,可能是F2、F8、F10、F12、ESC或Del等按键)。如下图提示为【DEL】按键。该方法可能会因为一些情况而失败,比如连续点击BIOS快捷键的速度过慢,或者是点击快捷键的时机没有掌握好。如果您使用该方法一直失败,可以尝试下面的方法2。
方法2:从Windows 设置中进入UEFI BIOS
① 启动Windows电脑,点击【开始】菜单,选择【设置】以进入Windows设置页面,点击【更新和安全】。
② 选择左侧【恢复】选项,在右边出现栏目中点击【高级启动】标签下的【立即重新启动】按钮。
③ 接下来电脑将会重启进入到“选择一个选项”界面。选择【疑难解答】-【高级选项】-【UEFI固件设置】。之后电脑将重启并进入到UEFI BIOS设置界面。
2、禁用安全启动(Secure Boot)
下面以MSI品牌为例介绍在UEFI BIOS禁用安全启动的步骤。
步骤1:进入到UEFI BIOS中以后,如果BIOS是处于Easy Mode(简单模式),可以按 【F7 】进入高级模式(Advanced Mode)。
步骤2:跳转到【SETTINGS】(设置)>【Advanced】(高级)>【Windows OS Configuration】(Windows操作系统配置),之后将【Secure Boot】设置为【Disabled】。
步骤3:保存设置并重启电脑。
如果您无法在PC上禁用安全启动,可能是因为您的PC没有禁用它的选项,这取决于PC制造商是否添加该功能。因此,如果您在设备上找不到该选项,建议联系制造商寻求帮助。
以上是关于windows启动过程的主要内容,如果未能解决你的问题,请参考以下文章
对于某些版本的 Windows,Windows 服务无法在用户使用 WTSQueryUserToken 登录时启动交互过程