IO.SYS是启动管理器吗
发布网友
发布时间:2022-04-29 12:19
我来回答
共1个回答
热心网友
时间:2022-06-27 14:17
【★】哈搂【★】
.
IO.SYS为WIN9X模式下的重要启动文件,主要控制启动中由机器向操作者之间的重要转换,是WIN9X系统启动的枢纽。IO.SYS位于C:\下,和MSDOS.SYS COMMAND.COM共同构成WIN9X的启动核心,通常情况下为系统、只读、隐藏属性。其中MSDOS.SYS对IO.SYS起配置作用。Win 9X的IO.SYS由原DOS的系统文件IO.SYS、MSDOS.SYS合并而成,提供标准硬件的输入/输出接口和DOS的中断调 用,功能全面增强,它基本上控制着Win 9X的全部启动过程,是Windows的DOS实模式的核心文件。但它需要根据MSDOS.SYS的设置才能实 现正常的启动过程。
.
更多具体内容,还请知友点击下面的链接,自行查看详细内容:
.
http://ke.baidu.com/view/1251717.htm
.
参考资料:
.
★解析Windows的启动过程
Windows的启动过程么,主要包括以下几个部分:
1. Master Boot Record (MBR)
2. Boot sector
3. Ntldr (这个可能有人会觉得眼熟,是不是碰到过启动的时候说找不到Ntldr呢?;) )
4. Ntoskrnl.exe
5. Smss
6. Winlogon
7. Service control manager (SCM)
-----------------------------------------------------------------------------------------------------------------------
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才完成了它的使命。
.
如果我的解答对解决你の问题有帮助.请点击我的回答下方【选为满意答案】按钮.