Windows启动

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

 

Windows 内核研究_1.Windows启动
2009年02月22日 星期日 下午 01:21

 

 

 

 

Windows启动过程预览
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才完成了它的使命

win11 for arm 更新 KB5016629 使系统崩溃 阅读详情

相关推荐

Nginx在Windows下开机自动启动

安装Nginx 在Nginx官网下载页面下载Nginx Windows版本,下载后解压,然后运行目录下的 nginx.exe 启动nginx,这时打开浏览器输入 http://localhost:80/ 就可以看见nginx的欢迎页面,说明nginx已经成功启动了。 Windows下开机自启动 关闭计算机后重新打开电脑,这时如果再去访问 http://localhost:80/ 会报...

weixin_43067157的博客 2万+

Windows高级启动

Windows 10 中的多启动过程步骤有别于旧版。例如在 Windows 10 与 Windows 7 的双操作系统环境下,启动进入 Windows 7 的实际步骤如下。启动 Windows 10 →执行 bootim.exe →设置临时启动项→重新启动计算机→使用bootmgr 加载 Windows 7。这个过程实际等于启动了两次,而且如果 Windows 10 的启动文件出了问题的话,可能连启动菜单都无法进入。

悦分享 1951

Windows启动原理及启动优化

为什么开机进入系统慢?各种开机启动故障让你头疼?了解启动的奥妙,对于Windows系统管理者来说十分重要,对于启动时的故障排查、启动优化有很大帮助;本文将概述计算机启动的原理并提供多种启动优化的解决方案。

Cloud_YC_Wei的博客 1203

Windows10启动过程详解

计算机启动是一个复杂而有序的过程,而使用 UEFI 和 BIOS 启动 Windows 10 又是两种不同的过程。

悦分享 2208

win11自动修复失败【已完美解决】

win11自动修复失败的完美解决方案

Jiang5106的博客 7万+

Windows启动原理

Windows启动过程极其额复杂。以Windows XP为例,它过程的启动大致分为5个步骤。 第1步 预启动:首先电脑通电自检,并由BIOS(基本输入输出系统)扫描硬件并完成基本硬件配置,然后读取硬盘的MBR(主引导记录)检查硬盘分区表(DPT),自检 后,DPT把系统的控制权交给硬盘的第一个分区PBR(Partion Boot Record),XP的PBR会去找这个分区的NTLDR

踏实每一小步,成就一大步 6511

最完整的Windows启动与关机过程

最完整的Windows启动与关机过程        最近在CSDN上上传了《Microsoft® Windows® Internals, Fourth Edition: Microsoft Windows Server™ 2003, Windows XP, and Windows 2000》,此书是计算机学习的经典之作。本来说自己有空的话把该书翻译一遍,然后供志同道合者参考,但一直没有

lanhai96的专栏 6938

windows系统在启动界面无法启动

换言之,如果问题依然存在,或者您不确定如何操作,建议联系专业的技术支持人员寻求帮助。在处理技术问题时,合理利用工具如gptgaixie、rbsci、PaperBERT等可以提高效率,这些工具可以帮助您更准确地理解文档和技术指南,从而更好地解决问题。一、了解“Windows系统在启动界面无法启动”的含义当您遇到“Windows系统在启动界面无法启动”这个问题时,意味着您的计算机已经完成了硬件检测(POST过程),并且成功加载了Windows启动管理器,但在尝试加载操作系统的核心组件时遇到了错误。

x3088的博客 4479

Windows开机启动命令

​Logon​: 最常用的标签,对应我们之前讨论的注册表、启动文件夹等登录项。​ Scheduled Tasks​: 任务计划程序中的项目。​ Everything​: 显示所有项目(信息量巨大)。在了解了二者的适用场景后,我们就可以准确选择出最适合自己的方法(具体设置方法如下)。​ 备份配置​:导出注册表启动项或任务计划,便于迁移和恢复。​: 右键点击解压出来的 Autoruns64.exe,选择 ​​“需要管理员权限才能向此目录添加文件。

凭栏落花侧的博客 2078

windows redis启动

下载好redis后,只需解压。 然后打开dos窗口 进入redis解压目录 cd D:\software\Redis-x64-3.2.100 运行下面命令启动 redis-server.exe redis.windows.conf 成功启动 还可以把redis加入都开机自启动 redis-server --service-install redis.windows-service.co...

whandgdh的博客 2万+

Windows启用快速启动

Windows启动速度一直是用户所关心的问题之一,Windows 开发团队也在这方面付出了巨大的努力。Windows 10 中的快速启动功能采用了类似休眠的混合启动技术(Hybrid Boot),能使计算机快速启动。从实际感受来说,采用同等配置的情况下,Windows 10 的启动速度明显比 Windows 7 更迅速。如果使用 UEFI 固件,启动速度则会更快。

悦分享 1656

全面掌握WINDOWS启动项目管理

htmltable {th, td {th {pre {简介:Windows启动项目管理器是一个工具,帮助用户管理和控制Windows中的自启动程序,这对优化系统性能和提高开机速度至关重要。启动项目分散在注册表键、启动文件夹、任务计划程序和服务等多个位置。这款工具可查看、启用/禁用、添加/删除启动项,提供优化建议和安全检查,同时支持日志记录。介绍了一个名为的安装程序,说明了其安装过程,并强调修改启动项目时需谨慎,以防误删重要系统服务或程序。

weixin_32312889的博客 1205

Windows的自启动方式

Windows的自启动方式创建时间:2003-10-24文章属性:转载文章提交:Sowhat (sowhat_at_linuxforum.net)/*老文章,但是值得一读*/      Windows的自启动方式    这篇文章断断续续写了有一年,在有些论坛也曾经贴过,读者的回复是两种, 一是不错,二是抄袭。但是我可以保证所有的内容是我个人查阅的资料(包括大脑)和进行试验与思考的结果。如果这也算抄

痴一居 1320

windows 下frp服务启动_Windows 下 Frp 设置开机自动启动

本文介绍如何在 Windows 下设置 Frp 开机自动启动。每次要手动运行 Frp 是件麻烦事 →_→ 所以自动启动 Frp 很重要。这里将会给出两种自动启动 Frp 的方法,接下来我们就一起来看看吧。首先,两种方法都必须照着下面这个步骤做才能实现自动启动 (这不是废话吗先在你的 Frp 同目录下新建一个文本,并改名为 start.bat,如果你的文件名是 “新建文本文档” 而不是 “新建文本文...

weixin_39719018的博客 9244

windows启动修复_如何使用Windows启动修复工具修复启动问题

windows启动修复If Windows isn’t starting properly, you can often use the integrated “startup repair” tool to fix it. This recovery tool will scan your PC for problems like missing or damaged system files....

culul01313的博客 9824

Windows怎么启动nginx

Windows 启动 Nginx 有 3 种常用方式,推荐用命令行启动(便于管理与排错),也可双击 exe 快速启动或注册为系统服务实现开机自启,以下是详细步骤与验证、管理方法。在 “Path” 填nginx.exe路径(如D:\nginx\nginx.exe),点击 “Install service” 完成注册。从Nginx 官网下载 Windows 版压缩包,解压到无中文 / 空格路径(如D:\nginx),路径下会有nginx.exe。nginx:前台运行,占用窗口,Ctrl+C可停止(适合调试)。

我就是你毛毛哥的博客 1527

Windows 10 启动过程解析

系统从开机到登录的完整流程可分为六个关键阶段。首先由BIOS/UEFI固件执行硬件检测和安全验证,UEFI模式通过SecureBoot检查启动文件签名。接着加载启动管理器(bootmgr/bootmgfw.efi)并读取BCD配置,确定启动选项。随后加载Windows内核(ntoskrnl.exe)和核心驱动,初始化系统关键进程。最后创建用户会话,加载登录界面完成认证。整个过程涉及MBR/GPT分区结构、EFI系统分区、注册表控制集等多个关键组件,每个阶段都可能出现特定故障(如蓝屏、启动失败等)。

weixin_63006261的博客 2152

windows启动nacos启动失败

一、问题 Windows 启动 Nacos 失败 java.io.IOException: java.lang.IllegalArgumentException: db.num is null 失败截图: 二、解决 进入nacos解压目录下bin文件目录下,用文本编辑工具打开startup.cmd set MODE=“cluster” 修改为 set MODE=“standalone” 三、结果 四、报错原因 nacos默认集群启动,未配置的情况下需修改为单机启动 ...

大树 4185
上一篇: 启动代码
下一篇: T1
SearchLife
博客等级 码龄20年 51粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值