windows之启动过程(一)

时间:2022-03-14 02:03:38

windows的启动过程一直是我比较感兴趣的。下面看一下他是怎么启动的。


1. BIOS 加电自检

  1. (包括枚举设备,初始化显卡等。这时可以进入BIOS内进行一些主板设置,如修改主板时间、设置从USB启动等)


2. BIOS 选择一个启动设备,执行主引导记录(MBR)。

  1.  MBR是一个设备的第一个扇区,包含引导代码和分区数据。最多支持4个分区数据,如果你把系统安装到一个分区中,则在MBR中有该分区信息,并标记该分区为主引导分区。
  2.  MBR从分区数据中找到一个引导分区,然后跳到该分区的引导扇区的代码块执行。


3. 执行引导扇区代码。

  1.  引导扇区是一个分区的第一个扇区,该扇区中包含对该分区的描述信息也包含启动代码。描述信息包括:是哪一种文件系统(FAT\FAT32\NTFS)、分区占得扇区个数、一个簇包含多少个扇区等信息。
  2.  由于引导扇区为512个字节,所以代码很少,这时候可能需要更多的扇区的代码来完成加载。


4. 加载NTLDR

  1.  由于引导扇区中的代码包含了文件系统代码(该代码不是完整的,只有读功能,并且不支持子目录),所以可以找到NTLDR,并加载到内存执行。
  2.  NTLDR包含2个部分:实模式部分和保护模式部分(OS Loader)。
  3.  NTLDR会做一些初始化(如清空键盘缓冲区)然后开启CPU 保护模式(到目前为止一直在实模式下运行),如果是64位CPU,会开启长模式。
  4.  虽然开启了保护模式,但是还不能使用地址转译服务,只是可以使用32位的物理内存。

5. NTLDR Os Loader 部分

  1. 首先把物理内存管理起来,使用内存描述符数组吧每段内存的大小和用途记录下来。然后设置页目录和页表,使16MB以下的物理内存已经可以通过页面映射的机制访问。

  2. 在设置好页目录寄存器(CR3)、打开分页机制。

  3.  紧接着会对其他设备进行初始化,如IO设备

  4.  如果他需要使用BIOS中的服务(比如中断13h),必须保护好保护模式下的设置,并暂时切换到实模式,待服务完成后再切换到保护模式。

  5.  OS Loader 读取Boot.ini文件。OS Loader 包含文件系统代码(支持子目录)。

  6.  紧接着检查根目录下是否存在一个有效的Hiberfil.sys。如果存在,则从休眠系统恢复。

  7.  如果不从休眠恢复,则解析BOOT.ini,如果有多个引导选项,则会显示一个引导选项菜单,否则不显示。(引导选项中包含了各种参数,如是否开启调试模式及各种内存参数)

  8.  接下来他会加载并执行NTDetect.com程序,该程序是一个16位实模式程序,他利用BIOS来查询系统的基本设备和配置信息(包括系统日期和时间、总线类型、磁盘信息、IO接口等),并把这些信息写入注册表(HKLM\HARDWARE\DESCRIPTION)

  9.  加载Ntoskrnl.exe和hal.dll(这两个名字可以通过引导选项修改)

  10.  加载注册表的System储巢,并把标记为”引导启动“(BOOT_START)的驱动加载进来。

  11.  构造Loader_Parameter_Block参数块然后调用Ntoskrnl.exe模块的入口函数(KiSystemStartup)。该函数不会返回。

未完,请参看第二篇:

windows之启动过程(二)


参考书籍:

《windows内核原理和实现》

《深入解析windows操作系统》第4版

参考操作系统源码:

wrk1.2

ReactOs 0.3.14

转载请注明出处。ddlx studio。点点灵犀。 http://blog.csdn.net/sunyikuyu