NTLDR
NTLDR(NT loader的缩写)是微软的Windows NT系列操作系统(直至Windows XP和Windows Server 2003)的引导程序。NTLDR可以从硬盘以及CD-ROM、U盘等移动存储器运行并引导Windows NT系统的启动。如果要用NTLDR启动其他操作系统,则需要将该操作系统所使用的启动扇区代码保存为一个文件,NTLDR可以从这个文件加载其它引导程序。
NTLDR主要由两个文件组成,这两个文件必须放在系统分区(根据微软的定义,为在MBR中标识为活动分区的分区,一般为第一个分区/C分区):
- NTLDR,这是引导程序本身
- NTDETECT.COM,用于检测基础硬件信息,以便系统正常启动。
boot.ini也是比较重要的文件。它是引导程序的配置文件。当boot.ini丢失时,NTLDR会启动第一块硬盘第一个分区上的\Windows目录中的系统。
在安装、维护Windows NT系统时,可以使用fixmbr命令在硬盘中写入启动NTLDR引导程序的代码。
Windows Vista、Windows Server 2008及以后版本的操作系统中,NTLDR被BOOTMGR替代。
结构
NTLDR由两个可执行文件构成:
- 第一部分是一个标准二进制文件,用于切换系统至保护模式,使得系统能识别并运行可移植可执行(PE)文件,并运行第二部分。一般被称为STPBOOT.BIN
- 第二部分是一个可移植可执行文件,被称为OSLOADER.EXE
使用WinHex或者类似的二进制处理软件,在NTLDR中搜索“MZ”,并将其前的部分截去,即可以获得OSLOADER.EXE。在Windows安装文件中也可以找到压缩后的OSLOADER.EX_文件。
Windows NT最初是为ARC(一类RISC系统架构)设计的,因此只有OSLOADER.EXE,即系统加载器,通过接受指定的系统文件路径和其他启动参数引导对应目录下的Windows NT系统,而指定这些参数的工作交给ARC自带的启动管理器进行。x86架构缺乏启动管理器:BIOS只会调用第一启动设备的MBR中列明的活动分区的卷引导记录。因此启动管理器的功能被包括在OSLOADER部分中,直至微软在2003年引入了自己的启动管理器。ARC的启动管理器的保护模式切换和PE文件识别运行功能则交给STPBOOT完成。boot.ini中的列表项也被设计为类似于ARC的格式,以便直接传给OSLOADER.EXE。
启动步骤
- 与一般的系统启动进程一致,BIOS调用MBR,然后调用活动分区的卷引导记录,该卷引导记录被设计为搜索NTLDR,并执行之。
- NTLDR的第一部分被调用。此时系统进入保护模式,并可以识别并运行PE格式的可执行文件。
- NTLDR的第二部分,OSLOADER.EXE被调用。OSLOADER.EXE中内嵌有FAT、NTFS和ISO 9660三种文件系统的驱动,启动管理器,以及INI文件读取器的CAB文件解压缩器。OSLOADER中附带的文件系统驱动通过BIOS中断直接访问磁盘,因为内核和HAL此时都没有被加载。此时系统可以访问磁盘内的文件。
- 如果Windows被置于休眠模式,读取hiberfil.sys中的内容并将其写入内存,然后恢复系统的运行。
- OSLOADER使用内置的INI文件读取器,试图读取boot.ini文件的内容,并配置启动菜单。如果boot.ini不存在,OSLOADER将视为boot.ini中有且仅有一个指向multi(0)disk(0)rdisk(0)partition(1)\WINDOWS且没有参数的启动项目。如果boot.ini中只存在一个启动项目,则忽略timeout的时间设置(视为0)。
- 向用户显示启动菜单,并按照timeout的时间设置倒计时。如果用户按下按键,则停止倒计时。(这样即使只有一个启动项目,当用户在自检结束后狂按F8键,也可以进入高级开机菜单)
- 如果一个非NT的系统被选择,OSLOADER加载列表项中指定的启动扇区代码文件,并移交控制权。此时系统回到实模式。如果没有指定文件(常见于Windows 9x和Windows NT共存),则加载bootsect.dos,然后移交控制权,由其搜索并加载IO.SYS。
- 如果一个NT系统被选择,OSLOADER调用NTDETECT.COM。NTDETECT将检测系统硬件相关的信息,决定系统将使用的硬件配置文件,并将以上信息交给OSLOADER。
- OSLOADER根据NTDETECT返回的系统硬件相关信息,加载列表项中指定的文件夹中的Windows NT内核态管理程序(Windows Executive),包括NTOSKRNL.EXE及HAL.DLL。此外尚有KDCOM.DLL及BOOTVID.DLL也在这个阶段加载。
- OSLOADER加载注册表的SYSTEM配置单元,其中包含数个系统配置集,每个配置集都包括应当加载的驱动程序和服务等;以及一系列指示标志,指向默认配置集、上次启动失败的配置集及“最后一次正确的配置”对应的配置集。OSLOADER根据用户选择及上次启动情况选择配置集,读取对应的应当加载的驱动程序列表。
- OSLOADER将NTDETECT检测到的硬件信息及驱动程序列表交给Windows NT内核态管理程序,并移交控制权。[1]
boot.ini
在确认系统为冷启动,即非休眠模式后,NTLDR所做的第一件事为读取boot.ini。[2]
示例
以下是boot.ini的一个示例:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect
C:\grldr="Ubuntu"
C:\="Previous Version of Windows"
解释
- [boot loader]节:配置启动菜单的细节。
- timeout=30:timeout选项控制启动菜单显示的时间长度,单位为秒,最短为0,此时启动菜单不显示。
- default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS:default选项控制启动菜单的默认选项。
- [operating systems]节:列举启动项目。
- multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect:基于Windows NT的系统的启动项目。
- C:\grldr="Ubuntu":基于非Windows NT的系统的启动项目。
- C:\="Previous Version of Windows"
多语言支持
NTLDR不支持多语言,如果中日韩版本的Windows NT 5.x NTLDR找不到BOOTFONT.BIN字体文件,会自动显示英语代替。Windows Boot Manager支持多语言。
常见问题
NTLDR的问题常见于用户不慎将该文件删除,这样会导致Windows NT系列系统无法启动,开机时将以黑屏白字显示错误信息:"NTLDR is missing, Press CTRL+ALT+DEL to restart." 当用户重启后又将出现上述信息,这样就无法进入系统。
解决该问题需要向光驱内放入一张相应的Windows安装光盘,开机时先将BIOS设置为从光盘启动,进入系统安装菜单后再选择进入故障恢复台,按屏幕相关说明进入命令行模式,然后将光盘根目录下i386文件夹内的“ntldr”文件和“ntdetect.com”拷贝至系统分区根目录下,重新启动后将BIOS设置回复为硬盘启动即可[5]。
参考来源
- ^ Microsoft. Windows 2000 Professional Resource Kit 1st. Redmond, WA: Microsoft Press. 2000. ISBN 1-57231-808-2.
- ^ Rick Maybury, Startup and Shutdown Problems, part 1 (页面存档备份,存于互联网档案馆), Bootcamp, 2009, accessed 25 April 2012
- ^ 3.0 3.1 3.2 Russinovich, Mark. Boot INI Options Reference. Windows Sysinternals Library on TechNet. Microsoft. November 1, 2006 [August 19, 2009]. (原始内容存档于2008-04-30).
- ^ How to Triple Boot to Windows NT, Windows 95/98, and MS-DOS. Microsoft Support. 2007-01-19 [2019-10-12]. (原始内容存档于2015-06-02).
- ^ NTLDR文件丢失的解决方案. [2010-11-26]. (原始内容存档于2010-11-25).