windows的启动过程一直是我比较感兴趣的。下面看一下他是怎么启动的。
1. BIOS 加电自检
(包括枚举设备,初始化显卡等。这时可以进入BIOS内进行一些主板设置,如修改主板时间、设置从USB启动等)
2. BIOS 选择一个启动设备,执行主引导记录(MBR)。
- MBR是一个设备的第一个扇区,包含引导代码和分区数据。最多支持4个分区数据,如果你把系统安装到一个分区中,则在MBR中有该分区信息,并标记该分区为主引导分区。
- MBR从分区数据中找到一个引导分区,然后跳到该分区的引导扇区的代码块执行。
3. 执行引导扇区代码。
- 引导扇区是一个分区的第一个扇区,该扇区中包含对该分区的描述信息也包含启动代码。描述信息包括:是哪一种文件系统(FAT\FAT32\NTFS)、分区占得扇区个数、一个簇包含多少个扇区等信息。
- 由于引导扇区为512个字节,所以代码很少,这时候可能需要更多的扇区的代码来完成加载。
4. 加载NTLDR
- 由于引导扇区中的代码包含了文件系统代码(该代码不是完整的,只有读功能,并且不支持子目录),所以可以找到NTLDR,并加载到内存执行。
- NTLDR包含2个部分:实模式部分和保护模式部分(OS Loader)。
- NTLDR会做一些初始化(如清空键盘缓冲区)然后开启CPU 保护模式(到目前为止一直在实模式下运行),如果是64位CPU,会开启长模式。
- 虽然开启了保护模式,但是还不能使用地址转译服务,只是可以使用32位的物理内存。
5. NTLDR Os Loader 部分
首先把物理内存管理起来,使用内存描述符数组吧每段内存的大小和用途记录下来。然后设置页目录和页表,使16MB以下的物理内存已经可以通过页面映射的机制访问。
在设置好页目录寄存器(CR3)、打开分页机制。
紧接着会对其他设备进行初始化,如IO设备
如果他需要使用BIOS中的服务(比如中断13h),必须保护好保护模式下的设置,并暂时切换到实模式,待服务完成后再切换到保护模式。
OS Loader 读取Boot.ini文件。OS Loader 包含文件系统代码(支持子目录)。
紧接着检查根目录下是否存在一个有效的Hiberfil.sys。如果存在,则从休眠系统恢复。
如果不从休眠恢复,则解析BOOT.ini,如果有多个引导选项,则会显示一个引导选项菜单,否则不显示。(引导选项中包含了各种参数,如是否开启调试模式及各种内存参数)
接下来他会加载并执行NTDetect.com程序,该程序是一个16位实模式程序,他利用BIOS来查询系统的基本设备和配置信息(包括系统日期和时间、总线类型、磁盘信息、IO接口等),并把这些信息写入注册表(HKLM\HARDWARE\DESCRIPTION)
加载Ntoskrnl.exe和hal.dll(这两个名字可以通过引导选项修改)
加载注册表的System储巢,并把标记为”引导启动“(BOOT_START)的驱动加载进来。
构造Loader_Parameter_Block参数块然后调用Ntoskrnl.exe模块的入口函数(KiSystemStartup)。该函数不会返回。
未完,请参看第二篇:
参考书籍:
《windows内核原理和实现》
《深入解析windows操作系统》第4版
参考操作系统源码:
wrk1.2
ReactOs 0.3.14
转载请注明出处。ddlx studio。点点灵犀。 http://blog.csdn.net/sunyikuyu