flytmj
驱动牛犊
驱动牛犊
  • 注册日期2005-07-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望70点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
阅读:1485回复:0

Windows内核学习小记之系统启动顺序

楼主#
更多 发布于:2007-05-10 11:44
  标题:  Windows内核学习小记之系统启动顺序
作者:  Condor
出处:  http://www.staresky.com
  
 ................................................................................................  
  参考书目:Windows Internals
  Undocumented Windows 2000
  Windows NT File system Internals
 
 1、 首先系统起动模块调用NT起动子例程,并把BootRecord结构参数传给NT起动子例程,BootRecord中包含有机器的基本信息和后期系统Loader组件所需要的环境信息。
 NT起动子例程执行的工作包括:一些全局变量的初始化、判断系统引导盘的位置
 
 2、 系统起动例程调用引导加载例程,值得注意的是: 引导加载例程通常不反回任何值给系
 统起动例程,毕竟在引导过程中如果发生错误直接的结果就是系统挂起然后重起机器。
 引导加载例程打开引导盘并读取boot.ini文件,由于此时标准的文件系统驱动还没加载,
 
 所以引导加载例程不得不把文件系统类别(NTFS,CDFS,FAT,HPFS)的判断和读写写死在引导加载例程里,这也导致在没有MS的帮助下由第三方提供引导文件系统的实现是非常困难的。此刻,交互信息的显示还都用的是显卡的80*50字符模式。
 
 之后引导加载例程通过前面讲过的文件系统模块读取整个boot.ini,并把可选的操作系统列表选项显示给用户,如果boot.ini是空的那么引导目录是C:\WINNT。如果用户在操作系统选择菜单中选中NT或因等待超时而自动选择NT后引导加载例程读入ntdetect.com
 
 接下来系统加载器ntldr.exe被加载到内存里,随后ntldr把ntoskrnl.exe加载到内存里,在ntoskrnl.exe成功加载之后ntldr把hal.dll加载到内存里。再后面ntldr把boot driver(也就是Start值为0的driver)加载到系统里,在这过程中如果有一个关键boot driver发生
 
 错误则系统就需要重起,否则系统继续后面的工作。上述工作完成之后ntldr便把控制转交给ntoskrnl的入口点函数。
 
 3、 ntoskrnl入口点函数调用KeInitalieKernel()完成系统内部全局变量和Idle线程及进程的初始化工作。一旦Idle线程初始化工作完成,之后的Executive初始化工作就交由Idle Thread来完成。
 
 4、 紧接下来的就是Executive部分的初始化,而该部分工作可分为两个阶段:
 
 (1)各组件初始化其内部状态
 ++HAL初始化其内部状态
 ++Executive组件初始化其内部状态
 ++虚拟内存管理器(VMM) 初始化其内部状态
  ++对象管理器初始化其内部状态
  ++安全子系统初始化其内部状态
  ++进程管理器初始化其内部状态
 (2)各组件接受所有的请求以完成它们的初始化工作
 ++HAL被调用,以完成初始化工作
 ++系统时间被初始化
 ++在多处理器系统里,开启其它处理器
 ++对象管理器、Executive组件和安全子系统被调用,以完成它们剩余的初始化工作。
  ++虚拟内存管理器完成初始化工作,至此它已可以为其它模块提供完整的服务。
  ++初始化缓存管理器
  ++初始化配置管理器,配置管理器管理NT注册表,此时HKLM\SYSTEM和HKLM\HARDWARE已经可用。
  ++I/0管理器被调用执行其初始化工作,此过程包括各种同步变量、内存池及链表的创建,此时I/0管理器还在名字空间中创建了\Device,\DosDevices和\DriverRoot目录,接下来boot driver被初始化,再后Start值为1的driver被加载并被初始化
  ++进程管理器和LPC子系统完成初始化工作
  ++Reference Monitor和Session子系统完成初始化工作
 
 5、 完成系统引导过程的剩余部分,包括System进程里系统线程的初始化工作等。
 6、 加载并完成Start值为2的内核Driver,并完成其初始化工作。
  
 
 
 
 System start-up module
 |-->System Startup routine
 |-->Boot loader 读 boot.ini
 |-->Ntdetect.com 检测硬件配置
 |-->ntldr.exe
  |-->hal.dll
  |-->boot driver (Service Start 值为 0 的driver)
  |-->ntoskrnl.exe
  |-->KeInitalieKernel(ExecutiveInit,Idle Thread and Process, System Thread and Process)………..
  |-->Start1
  |-->Start2
 
欢迎大家访问小弟的小站 http://www.staresky.com

最新喜欢:

linshierlinshi...
游客

返回顶部