zoukankan      html  css  js  c++  java
  • Windows开机启动过程 zz

    http://www.rosoo.net/a/201207/16140.html

    http://www.linuxidc.com/Linux/2008-01/10455.htm

    http://www.longene.org/forum/viewtopic.php?f=8&t=226

    Windows 启动过程听课笔记

    cpu加电复位 -> post(Power on self test) -> bios -> mbr(main boot record) -> 引
    导扇区(由操作系统安装时候写好) -> NTLDR -> NTOSKRNL(此时出现 xp 启动画面) ->
    SMSS(第一个进程) -> CSRSS, WinLogon

    WinLogon -> LSASS, Services, LogonUI

    Services -> SvcHost
    LogonUI -> UserInit -> Shell(Explorer), Autorun app
    启动完毕

    系统根目录最重要文件:NTLDR,boot.ini,NTDETECT.com
    Windows Vista 用注册表取代了Boot.ini

    NTLDR:
    使CPU从16位进入32位保护模式
    启用CPU的页机制(可以提供虚拟内存机制)
    若是SCSI硬盘,则加载BtBootDD.sys访问硬盘,否则使用Int13 BIOS服务访问硬盘
    若发现有效的hiberfil.sys,则恢复上次休眠
    读取boot.ini(多启动菜单)
    若用户按F8则出现详细启动菜单
    加载NTDETECT.com(基本硬件检测),调用BIOS收集系统基本信息(时间,总线类型,磁
    盘,输入设备,端口,显卡),保存到注册表HKLM\hardware\description
    显示启动进度条(那个文本小箭头)和Splash(XP 滚动条画面)
    加载NTOSKRNL.exe和HAL.dll,以及它们依赖的模块(bootvid.dll, kdcom)
    加载注册表的System Hive(!),并加载驱动程序(加载那些被定义为boot类型--ser
    vice_boot_start(0) 的驱动)
    执行NTOSKRNL.exe的入口函数

    NTOSKRNL:windows内核,且又是一个提供外部函数的DLL(?)
    其入口函数为KeStartAllProcessors()启动所有的CPU
    对于每个CPU,设置其GDT(Global Descriptor Table),IDT(Interrupt Descriptor T
    able),TSS(Task State Segment)
    分配用于处理Double Fault异常(异常处理过程中的异常)的TSS和Stack
    分配用于处理不可屏蔽中断NMI的TSS和Stack
    分配DPC栈(延迟过程调用)
    将ProcessorState的ContextFrame Struct 的EIP字段指针设置为KiSystemStartup函数的
    地址
    调用KiInitializePcr()初始化PCR(Processor Control Region 用来记录CPU状态)和PR
    CB(Processor Control BLOCK)
    调用HalStartNextProcessor()

    KiSystemStartup()
    {
    先递增KeNumberProcessors全局变量;
    HalInitializeProcessor(); // 初始化CPU
    KdInitSystem(); // Kernel Debug 子系统初始化(内核调试引擎,用于双机调试)
    KiInitializeKernel() // 初始化内核数据结构,创建IDLE进程,启动初始化执行体的循

    {
    KiInitSystem();
    KeInitializeProcess(); // 初始化Idle进程
    // 仅第一个CPU需要执行上两步

    KeInitializeThread(); // 初始化Idle线程

    ExpInitializeExecutive() //
    {
    foreach()
    {
    各个执行体的Phase0的初始化函数(?);
    }
    }
    }
    此时将IRQL(中断优先级?)降到DISPATCH_LEVEL,然后跳转到KiIdleLoop(),退化成I
    dle进程;
    }

    Phase0的初始化:
    只有CPU 0 执行,此时为单线程环境
    由进程管理器的Phase0初始化时创建系统进程,当Phase0执行完毕,执行Phase1Initiali
    zation,也就是系统线程。(Phase1执行时间比较慢,此时是XP 滚动条画面)
    Phase1为多线程环境,Phase1结束后,执行SMSS,到此,内核执行基本完毕
    全局变量InitializationPhase代表当前所处阶段,启动成功后等于2
    ExpInitializeExecutive()函数中初始化的组件有:(名称后面是它们的初始化函数)
    内存管理器 - 构建页表和内部数据结构
    对象管理器 - ObInitSystem,建立名称空间
    安全 - SeInitSystem,初始化token对象类型
    进程管理器 - PsInitSystem
    定义进程和线程对象类型
    建立用于记录活动进程和线程的链表结构(PsActiveProcessHead,)
    为初始的进程建立一个进程对象(PsIdleProcess),并命名为Idle
    创建系统进程(全局变量PsInitialSystemProcess)和线程,起始地址指向Phase1Initi
    alization函数
    PnP管理器

    Phase1Initialization: 0%-%5
    HalInitSystem()
    HalpInitReservedPages
    HalpInitNonBusHandler
    HalpGetFeatureBits
    HalpEnableInterruptHandler
    InbvEnableBootDriver
    InbvEnableDisplayString(0)
    DisplayBootBitmap
    PoInitSystem
    Hal!HalQueryRealTimeClock
    KeSetSystemTime
    PoNotifySystemTimeSet
    nt!InbvUpdateProgressBar(5)

    Phase1Initialization: 5%-10%
    ObInitSystem
    ExInitSystem:创建执行体的内核对象类型(Semaphore,mutex,event,timer)
    KeInitSystem:初始化线程调度的数据结构和系统服务分发表
    KdInitSystem:初始化内核调试引擎的数据链表,全局变量
    SeInitSystem:创建Security目录
    nt!InbvUpdateProgressBar(10)

    Phase1Initialization: 10%-15%
    MmInitSystem:创建Section对象和内存管理的系统工作线程
    CcInitlizeCacheManager:初始化文件系统缓存数据结构和工作线程
    CmInitSystem1:配置管理器创建Registry对象
    CcPInitializePrefecthcer:Prefetch初始化
    nt!InbvUpdateProgressBar(15)

    Phase1Initialization: 15%-20%
    ExpRefreshTimeZoneInformation;设置时区
    FsRtlInitSystem:文件系统初始化
    KdDebuggerInitialize1
    PpInitSystem:PnP管理器初始化
    nt!InbvUpdateProgressBar(20)

    Phase1Initialization: 20%-25%
    LpcInitSystem:Local Procedure Call 子系统
    创建日志文件 System32\Ntbtlog.txt
    nt!InbvUpdateProgressBar(25)

    Phase1Initialization: 25%-75%
    IO管理器初始化并枚举设备,加载设备驱动
    IOInitSystem
    nt!InbvUpdateProgressBar(75)

    Phase1Initialization: 75%-80%
    MmInitSystem2:释放启动过程中使用的内存,若是以安全模式启动,则此信息写入注册表

    nt!InbvUpdateProgressBar(80)

    Phase1Initialization: 80%-85%
    Kel386VdmInitialize:DOS虚拟机初始化
    KiLogMcaErrors:检查和记录Machine Check Architecture
    PoInitSystem1:电源管理器阶段1初始化
    PsInitSystem1:进程管理器阶段1初始化,调用PspInitializeSystemDll初始化系统DLL(
    ntdll.dll),将其映射到用户空间(PspMapSystemDLL)
    nt!InbvUpdateProgressBar(85)

    Phase1Initialization: 85%-90%
    MmFreeLoaderBlock:释放加载参数块(LOADER_PARAMETER_BLOCK struct)
    SeRmInitPhase1:Security Reference Monitor Phase1 初始化,创建用于和LSASS进程通
    信的Command Server Thread线程
    nt!InbvUpdateProgressBar(90)

    Phase1Initialization: 90%-100%
    RtlCreateUserProcess:创建SMSS进程!
    FinalizeBootLogo
    ZwResumeThread:挂起当前线程
    nt!InbvUpdateProgressBar(100
    InbvEnableDisplayString(1)
    ZwWaitForSingleObject:等待5分钟,若5秒内SMSS退出,则蓝屏
    此后这个线程转变为Zero Page


    SMSS:
    第一个用户态进程
    执行BootExecute表键中定义的程序
    执行PendingFileRenameOperation表键中的延迟改名操作(卸载软件用?)
    初始化Paging File和未完成的注册表初始化
    加载和初始化Win32子系统的内核模块Win32k.sys
    创建Win32子系统服务器进程:CSRSS
    创建WinLogon进程

    WinLogon:
    启动LSASS进程
    (XP下)启动LogonUI进程
    加载GINA模块(缺省为MSGINA.dll),显示登陆对话框(GINA可以自己配置,hiahia)
    启动Services.exe

    登陆过程:
    WinLogon(Gina.dll)将用户名和密码发送给LSASS,LSASS验证,如果通过,创建一个To
    ken对象
    WinLogon启动HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Wi
    nlogon的userInit键值下的程序(缺省为UserInit.exe)
    UserInit执行登陆和初始化脚本,然后启动Shell键值中定义的shell程序(默认Explorer
    .exe)
    Explorer来到桌面
     
  • 相关阅读:
    attr全选第三次失效
    数据库拆分案例
    c#日期格式化
    MVC CheckBoxList的实现
    SQLSERVER如何使用递增排序的GUID做主键
    .net App_Browser文件夹的作用
    如何强制浏览器使用兼容模式
    MVC防止xss攻击 ——Html.AntiForgeryToken的AJAX提交
    数据库大数据量迁移的解决思路
    IIS同时实现网站部分使用https协议访问另一部分http访问
  • 原文地址:https://www.cnblogs.com/viviwind/p/2700553.html
Copyright © 2011-2022 走看看