Nov 3

NT启动详解 (转) 不指定

felix021 @ 2007-11-3 13:01 [IT » 操作系统] 评论(0) , 引用(0) , 阅读(4453) | Via 本站原创 | |
NT启动详解 (转)
        NT的真正接管系统乃是从NT分区的引导扇区被引导开始。引导扇的引导代码是在NT安装时被写入的。当NT被装在FAT分区时,NT SETUP写入的是能识别FAT FS的引导代码,而当NT被装在NTFS分区时,NT SETUP写入的是能识别NTFS的引导代码。所以,引导扇区含有一段相关的文件系统代码。注意!这段代码对文件系统仅能进行读操纵,而不能进行写操作。    
        当引导扇区被引导后,他所干的一件事就是查找NTLDR。该文件必须存在于根目录下,否则系统提示:  
        BOOT:Couldn't find NTLDR。或A kernel file is missing from the disk。NT就死翘翘了。当加载NTLDR的时候系统仍然是处于实模式下。所以,NTLDR的第一件大事就是将CPU从实模式转换到保护模式下。当 NTLDR将所有的1M以下的内存页描述符创建好后,NTLDR再开启页映射功能,现在NT可以访问4G内存了。然后,NTLDR通过内建的文件系统代码来查找根目录下的BOOT.INI。(NTLDR含有FAT和NTFS2种文件系统的只读代码)根据BOOT。INI的内容提示用户可选的操作系统。当用户在缺省的时间内没有选择。NTLDR就引导缺省的操作系统。如果用户选择DOS,那么NTLDR就将根目录下的BOOTSECT。DOS装入内存, (BOOTSECT。DOS是DOS引导扇的COPY件。)然后执行一次热启动。如果此时C:是NTFS,DOS就不会被启动出来。否则,DOS就被引导出来了。  
        啊哈,然后NTLDR就加载NTDECT.COM。这个程序将显示NTDETECT V4.0 ......这个NTDECT.COM调用的乃是INTxx来执行一大堆的BIOS系统调用。用来进行系统配置的检测。所有检测到的东西将被存到系统注册表的HKLM\HARDWARE\DESCRIPTION项下。  
        然后,执行再次恢复到NTLDR。屏幕显示OSLOADER V4.0 ......接下来被加载的2个文件组成了WINDOWS NT的核心。那就是:HAL。DLL,NTOSKRNL.EXE。这2个文件在装载时将被检测PE校验和,如果有问题或找不到。NT又要死翘翘了。有一点要说明。单处理器和多处理器的NTOSKRNL.EXE是不同的。支持多处理器的NTOSKRNL.EXE在安装盘里的文件名称是 NTKRNLMP.EXE。但是一旦被COPY到NT的系统目录里,名字就变成了NTOSKRNL.EXE。因为NTLDR只加载 NTOSKRNL.EXE。
        加载完这2个文件后,NTLDR再加载SYSTEM,然后NTLDR再加载所有引导必须的驱动程序。
        然后加载HKEY_LOCAL_MACHINE\SYSTEM \Services里的值SERVICE_BOOT_START的DRIVER。(此时不初始化。)(我也不知道SERVICE_BOOT_START的 DRIVER怎么写,因为一般的KMD如果用SERVICE_BOOT_START值启动就会失败。)然后NTLDR就会锁定NTOSKRNL.EXE的 main()函数,然后将控制转移给NTOSKRNL.EXE。  
        BTW:NTOSKRNL.EXE的main()函数是  
    int main()  
    { // Fire up NT!  
      //  
      KiSystemStartup();  
      return 0;  
    }  
        这里描述的乃是NT FOR I386的最初的启动。从引导到加载NTOSKRNL.EXE。而且里面仍然有很多分支没写。例如LAST KNOWN GOOD CONFIGERATION的处理等。直到现在,NT还没有任何NT的模样,连操作系统的雏形也没显示出来。  
        接下来NT开始了自己复杂的OS核心初始化。首先调用ExpInitializeExecutive,而该函数则调用HAL。DLL里引出的函数 HallnitSystem()。这时。NT就完成了对中断控制器的初始化和时间片的设定。当HallnitSystem()返回,接下来进行的就是对内存管理器,安全引用监视器,对象管理器,进程管理器的初始化。在内存管理器完成初始化后,NT才显示Microsoft (R) Windows NT (TM) Version 4.0 (Build 1381)。而后面的SERVICE PACK号码则是从注册表里HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows \CSDVersion取出。当进程管理器初始化完成后(进程管理器是NTOSKRNL.EXE里最后被初始化的一个管理器),进程管理器产生2个进程。 一个,乃是IDLE进程。一个,乃是SYSTEM进程。而当返回到ExpInitializeExecutive后, ExpInitializeExecutive就变成了IDLE线程。而IDLE线程的优先级是最低的。  


  
作者: Felix021   2007-11-3 03:01   回复此发言    

--------------------------------------------------------------------------------

2 回复:NT启动详解 (转)  
BTW:最要命的是NT SERVER的调度算法。每个线程在INTEL处理器上通常一下就占用120ms。当线程等待一个IO处理时,必定会吃到一个IDLE线程。因为NT的 WIN32子系统通常在IO执行完成前不会返回到调用者,而且不切换到其他线程,所以通常情况下如果用SOFTICE呼出来总是看到系统停在HLT指令上。当一个硬件设备完成IO后,产生中断来结束HLT。然后在大堆的后续代码后才回到调用者。如果关闭HLT。系统能够在有限的范围内提高反应速度。我的 HALPATCH就是干了关闭HTL指令的活。好了好了。回到NT的启动话题。  
现在调用HAL激活多CPU的功能。(如果系统有2个以上CPU的话。WORKSTATION支持2CPU。SERVER支持4CPU。企业版支持 8CPU。企业版SP3后还支持3GB应用程序空间。)然后将依次调用Object Manager, Executive, Kernel, Security Reference Monitor,Memory Manager,Cache Manager,Configuration Manager,I/O Manager, Process Manager。  
其中IO管理器负责完成启动值为SERVICE_BOOT_START的驱动程序的初始化,紧接着,启动注册表内启动值为SERVICE_SYSTEM_START的装载。  
所有的DRIVER完成初始化后,还没有任何USER MODE的程序,也没有任何环境子系统。系统进程将调用核心函数ExInitializeSystem创建SMSS进程。就是SESSION MANAGER进程。SMSS是第一个USER MODE的应用程序。他又是一个真正的NATIVE APPLICATION。他不依赖于任何子系统。SMSS唯一需要的就是NTDLL。DLL。而且就是他创建了WIN32子系统。  
然后SMSS干了:  
创建LPC端口对象\SmApiPort。2个线程,等待客户请求如加载子系统等。  
创建环境变量。  
定义DOS符号联接。  
创建附加的页面调度文件。  
从HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Session Manager\BootExecute找出引导时加载的NATIVE APPLICATION。 通常有CHKDSK.EXE等。  
调用CONFIG MANAGER完成对 HKEY_LOCAL_MACHINE\SAM,HKEY_LOCAL_MACHINE\SAM\SECURITY, HKEY_LOCAL_MACHINE\SOFTWARE配置。  
然后加载WIN32K。SYS。这时系统就被切换到图形状态。  
启动WIN32子系统。即CSRSS.EXE。  
启动WINLOGON.EXE。  
创建用于调试的LPC端口,并创建线程来监视。  
完成了这些工作后,SMSS就永远等待WINLOGON和CSRSS的进程对象。把自己挂起。  
WINLOGON在被启动后。启动SCM(服务管理器)。将所有的"自动启动"的SERVICE启动起来。当然,WINLOGON并不等待任何 SERVICE的完成启动。很有可能用户已经登陆而SERVICE没有启动出来。当用户的START组里有某些应用程序需要依赖于某些SERVICE的存在的话,就有可能出错。这也是新闻组上老是有程序员讨论的老话题了。就象我们的程序员朋友老是爱写些很初级的问题到自己的主页上:)开玩笑:)。  
当所有的SERVICE启动无误后,现在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet就成为了LAST KNOWN GOOD CONTROL SET。  
当启动SCM后,WINLOGON就创建个工作站,代表KBD,MOUSE,MONITOR。并确保连SERVICE也不能访问该工作站,以保证安全性。 当工作站创建好后,就打开3个桌面。APP,SCR SAVER,WINLOGON。MS号称确保WINLOGON桌面的任何激活代码和数据都不能被访问。简直就是屁。只要知道WINLOGON代码的物理内存地址,什么不能修改办到?:)当然,不知道WINLOGON的物理地址倒是真的:)然后就是建立LSA和LPC联接。用于登陆。注销。口令操作。  
通过调用LsaLookupAuthenticationPackage获取MSV1_0的相关ID,用于验证身份。(从INSIDE WINDOWS NT抄的:))创建WINLOGON窗口类。确保SAS序列键按下后窗口过程被调用。只有WINLOGON桌面解锁后才能切换到其他应用程序桌面。  
在LOGON时,WINLOGON调用GINA来确认用户登陆。这样也提供了一个替换NT本身登陆验证操作的方法。MS的核心讨论组上老是有朋友研究如何获取PASSWD。而答案往往是提供个GINA STUB。:DDD 当然,我自己没有写过GINA STUB。但是MS的相关文档我看了一遍。。。估计对于写个有用的GINA STUB还不够。当然,我有偷懒的办法,也是多数写GINA STUB程序员的办法,就是把自己串到老的GINA STUB上:DD MS是极力不推荐这样干的。  
当用户验证身份完毕,登陆成功,桌面就被解锁。并且调用USERINIT.EXE。该程序会查找出用户的SHELL。并启动之。然后自己就结束生命。这就是从任何一个进程VIEWER看,SHELL都没有父进程的原因。因为父进程已经结束了。  
好了,这样,NT就彻底启动出来了。其中关键部分我想已经描述得很清楚了。将来有可能的话,我再对文章的语句润润色,看起来不要太枯燥。如果有错误,请指正。(我想,能指出错误的可是高手的高手了)
序!
转自:http://bbs.zndev.com/htm_data/87/0603/108042.html 驱动程序开发网技术社区  

  
作者: Felix021   2007-11-3 03:01   回复此发言    

--------------------------------------------------------------------------------




欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]