计算机与操作系统启动原理

原创 2002年06月03日 14:57:00

最近由于学习操作系统原理,加上自己对底层的兴趣,查阅了不少资料,现结合《INSIDE WINDOWS NT》以及网上不少网友的文章,以及自己的粗略理解,整理出关于操作系统启动的详细资料,以资共享,当然这其中有不少是摘录的文字,请原文作者原谅,如果有错误,还请各位指正:

在刚开机加电时,根据X386CUP的特性,代码段(CS,CODE SEGMENT)寄存器的值为全1,指令计数器(IP,INSTRUCTION POINTER)的值为全0,既CS=FFFF、IP=0000。这时CPU根据CS和IP 的值执行FFFF0H处的指令。由于FFFF0H已经到了基本内存的高地址顶端,所以,FFFF0H处的指令一般总是一个JMP指令,jump到另一个位於ROM BIOS中的位置(就是执行BIOS中的系统测试代码,随着制作BIOS厂商的不同而会有些许差异 )它负责开机自检。如检查内存,键盘等。在自检过程中,ROM BIOS会在上位内存(UMB,UPPERMEMORY BLOCK)中进行扫描,看看是否存在合法的设备控制卡ROM BIOS(如:SCSI卡上的ROM),如果有,就执行其中的一些初始化代码。紧接着系统测试码之后,控制权会转移给ROM中的启动程序(ROM bootstrap routine),这个程序会将磁盘上的第零轨第零扇区读入内存中(这就是一般所谓的boot sector,如果你曾接触过电脑病毒,就大概听过它的大名。假定硬盘是系统的启动磁盘。硬盘的第一扇区称为主引导记录(MBR, MASTER BOOTRECORD)。MBR 的长度为512字节。可分为两部分:第一部分为引导(PRE-BOOT)区,占了446个字节;第二部分为分区表(PARTITION PABLE),共有66个字节,记录硬盘的分区信息。预引导区的作用之一是找到标记为活动(ACTIVE)的分区,并将活动分区的引导区读入内存。如果用软盘启动计算机,ROM BIOS 读入的是软盘的引导区,既软盘的第一个扇区。),至於被读到内存的哪里呢? --绝对位置07C0:0000(即07C00h处),这是IBM系列PC的特性。经过一系列复杂操作后,最后将控制权转移给操作系统。
对于linux而言,开机磁盘的boot sector上的正是linux的bootsect程序,也就是说,bootsect是第一个被读入内存中并执行的程序。(鉴于大家研究linux不多,linux有源代码可参,bootsect.S->setup.S->head.S ->main.c,所以我就将linux以后的启动略去,主要看Windows的启动,且主要对于NT而言,2k类似。--因为9X已成为历史)对于NT而言,boot sector上的正是Windows引导扇的引导代码(他是在Windows安装时被写入的).  当引导扇区被引导后,他首先查找NTLDR.(该文件必须存在于根目录下,否则系统提示: 
BOOT:Couldn't find NTLDR.或A kernel file is missing from the disk.NT.接着该死机了)NTLDR首先将CPU从实模式转换到保护模式下.当NTLDR将所有的1M以下的内存页描述符创建好后,NTLDR再开启页映射功能,现在NT可以访问4G内存了.然后,NTLDR通过内建的文件系统代码来查找根目录下的BOOT.INI并根据BOOT.INI(这也是我们可以修改启动选项的地方)的内容提示用户可选的操作系统.当用户在缺省的时间内没有选择.NTLDR就引导缺省的操作系统.然后NTLDR加载NTDECT.COM.调用INTxx来执行一大堆的BIOS系统调用.用来进行系统配置的检测.所有检测到的东西将被存到系统注册表的HKLM/HARDWARE/DESCRIPTION项下.  接下来被加载的2个文件组成了WINDOWS NT的核心.那就是:HAL.DLL,NTOSKRNL.EXE.这2个文件在装载时将被检测PE校验和,如果有问题或找不到.NT又要死机了.加载完这2个文件后,NTLDR再加载所有引导必须的驱动程序,然后加载HKEY_LOCAL_MACHINE/SYSTEM/Services里的值SERVICE_BOOT_START的DRIVER.(此时不初始化.)然后NTLDR就会锁定NTOSKRNL.EXE的main()函数,然后将控制转移给NTOSKRNL.EXE.  接下来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线程的优先级是最低的. 
现在调用HAL激活多CPU的功能.然后将依次调用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.然后就是建立LSA和LPC联接.用于登陆.注销.口令操作. 
通过调用LsaLookupAuthenticationPackage获取MSV1_0的相关ID,用于验证身份.创建WINLOGON窗口类.确保SAS序列键按下后窗口过程被调用.只有WINLOGON桌面解锁后才能切换到其他应用程序桌面. 
在LOGON时,WINLOGON调用GINA来确认用户登陆.(这样也提供了一个替换NT本身登陆验证操作的方法)当用户验证身份完毕,登陆成功,桌面就被解锁.并且调用USERINIT.EXE.该程序会查找出用户的SHELL并启动他.然后自己就结束生命.

就这样,一个操作系统就完全启动了。 

计算机的启动过程(详细)

【转】计算机的启动 Feb 17th, 2013 寒假回来就要开始执行新年的计划了~首先是每周的一篇blog。 今天看了阮一峰最新的一篇博客计算机是如何启动的,感觉写得很好,又清楚又简单。...
  • langeldep
  • langeldep
  • 2013年04月11日 14:28
  • 80235

Windows(多)操作系统启动过程

一.WinPE启动原理 移动硬盘PE启动原理 WinPE文件组成: 引导文件:NTLDR和NTDETECT.COM 系统文件:WinNT.XPE(WinPE.XPE)和WinPE.IS_(...
  • antdz
  • antdz
  • 2015年10月09日 14:20
  • 1504

计算机启动从bios到操作系统整过程详解

BIOS控制着什么 熟悉计算机的朋友都知道BIOS这个概念,我们也会经常听到老鸟在解决系统故障时候重复的 那些话语:“先清除一下CMOS”或者“进入BIOS默认设置”等等。在普通人眼里,BIOS似乎 ...
  • pingzi459
  • pingzi459
  • 2015年11月11日 16:12
  • 3472

按下Power键后,计算机是如何启动的?

序言:上《计算机组成原理》课时,老师问了这个问题,看似每天都接触的计算机开机,作为一个计算机学子,应当有更细致的解释,所以上网上整理了一下。...
  • KevinBetterQ
  • KevinBetterQ
  • 2016年09月06日 19:13
  • 852

嵌入式系统启动过程

++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/a...
  • sunheshan
  • sunheshan
  • 2014年09月11日 16:23
  • 2180

操作系统的启动过程

这是我的第一篇博客,以后想要养成写博客记录自己学习过程的习惯,希望自己坚持! 言归正传,最近在学操作系统,看了一些书和视频资料,在这里写下我对操作系统启动过程的一些简单理解...
  • CjmHW
  • CjmHW
  • 2017年04月09日 23:46
  • 85

3.操作系统引导——操作系统启动

1.setup.ssetup中,操作系统接手硬件,初始化 开机做两件事:bootsect读入系统,setup初始化! ! setup.s (C) 1991 Linus Torvalds ! ! se...
  • jieqiong1
  • jieqiong1
  • 2017年01月11日 18:14
  • 223

嵌入式系统启动

嵌入式系统在启动时,引导代码、操作系统的运行和应用程序的加载主要有两种架构,一种是直接从Nor Flash启动的架构,另一种是直接从Nand Flash启动的架构。  1. 从Nor Fla...
  • a_chinese_man
  • a_chinese_man
  • 2017年05月26日 10:54
  • 276

【任务笔记】创建windows操作系统下的服务进程,并随操作系统启动自动开始执行

三步搞定,灰常简单。这个任务名称写的有点儿长,简单来说就是类似于linux系统下的守护进程。在windows系统中,被称为服务进程,可以在服务列表中查看、开启、关闭。 JAVA中其实进程的概念并不强烈...
  • tzimisce0_0
  • tzimisce0_0
  • 2014年02月27日 11:31
  • 879

计算机文件读写原理

在一个txt文件中,修改其中一个字,然后保存,这期间计算机内部到底发生了什么?操作系统如何将键盘输入的字符通过主板上密密麻麻的总线和芯片送到磁盘上的盘片上的?...
  • oZhuZhiYuan
  • oZhuZhiYuan
  • 2017年06月18日 16:34
  • 605
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算机与操作系统启动原理
举报原因:
原因补充:

(最多只允许输入30个字)