最近看ReactOS源码分析相关,看到内核加载器概念相关的;原文如下;

ReactOS源码分析——内核加载器(一)

计算机BIOS读取硬盘第一个扇区的数据到内存0x7C00位置,将控制权交给主引导记录(MBR),MBR再搜索系统的活动分区表,加载活动分区表的第一个扇区到一个固定的地址。MBR接下来将控制权交给PBR,PBR解析FAT或NTFS格式文件系统,找到引导内核的文件NTLDR,将该文件加载到0x20000。最后将控制权交给NTLDR进行内核启动。

原版的启动源码是一段汇编程序,这段汇编程序的路径大概是在“\boot\freeldr\bootsect\dosmbr.asm”。

我这里参考的源码不是原版ReactOS,这里的参考源码是源于《Windows内核设计思想》作者陈树宝改写的精简版BMR启动源码。我查看了原版DOSMBR代码,它的代码更加接近于Windows XP的启动逻辑。陈树宝的版本更加易于理解。下面给出陈树宝的代码片段:

start:cli             ; 关中断,将标志寄存器中的中断标志位清零,禁止中断;xor  ax, ax     ; 异或运算,两个操作数相同,即清零运算;mov  ss, ax     ; 设置栈段寄存器,段寄存器清零;mov  sp, 7c00h  ; 设置栈顶,栈顶为0x7C00;sti             ; 开中断,将标志寄存器中的中断标志位置1,开启中断;push 07c0hpop dsmov  ax, 07c0h  ; 设置数据段寄存器mov  ds, ax; 加载NTLDRpush  dword 80000h/512-8  ; count - ntldr扇区总数,80000h / 512 - 8 = 0x3F8push  dword 8             ; src - 开始读取的扇区号push  dword 20000h        ; des - 存放数据的目的地址call  LoadSector          ; 加载扇区;ntfsboot jmp 0x2000:0000,fatboot jmp 0x2000:0003push  word 2000hpush  word 0000h
o16 retf

以前对NTLDR概念不了解;下面来学习一下NTLDR相关内容;

NTLDR

简介
NTLDR全称是NT Loader,是系统加载程序
NTLDR文件是Windows NT/windows 2000/windows XP/windows server 2003的引导文件,当此文件丢失时启动系统会提示"NTLDR is missing..."并要求按任意键重新启动,不能正确进入系统,所以应该在系统正常的时候给予备份。

文件作用
NTLDR一般存放于C盘根目录下,是一个具有隐藏和只读属性的系统文件。它的主要职责是解析Boot.ini文件

正常系统引导过程
NTLDR文件的是一个隐藏的,只读的系统文件,位置在系统盘的根目录,用来装载操作系统。

一般情况系统的引导过程是这样的代码
1:电源自检程序开始运行
2:主引导记录被装入内存,并且程序开始执行
3:活动分区的引导扇区被装入内存
4:NTLDR从引导扇区被装入并初始化
5:将处理器的实模式改为32位平滑内存模式
6:NTLDR开始运行适当的小文件系统驱动程序。
小文件系统驱动程序是建立在NTLDR内部的,它能读FAT或NTFS。
7:NTLDR读boot.ini文件
8:NTLDR装载所选操作系统
如果windows NT/windows 2000/windows XP/windows server 2003这些操作系统被选择,NTLDR运行Ntdetect。
对于其他的操作系统,NTLDR装载并运行Bootsect.dos然后向它传递控制。
windows NT过程结束。
9:Ntdetect搜索计算机硬件并将列表传送给NTLDR,以便将这些信息写进\\HKE Y_LOCAL_MACHINE\HARDWARE中。
10:然后NTLDR装载Ntoskrnl.exe,Hal.dll和系统信息集合。
11:Ntldr搜索系统信息集合,并装载设备驱动配置以便设备在启动时开始工作
12:Ntldr把控制权交给Ntoskrnl.exe,这时,启动程序结束,装载阶段开始

Windows XP出现此故障的解决办法
当此文件丢失时,我们可以从安装光盘上进行提取,方法是:
1:进入系统故障恢复控制台。
2:转到C盘。
3:输入"copy X:\I386\NTLDR c:\"(说明:X为光驱盘符)并回车,如果系统提示要否覆盖则按下"Y",
输入"copy X:\I386\Ntdetect c:\",并回车,
之后输入exit命令退出控制台重新启动即可。

过程作用
NTLDR一般存放于C盘根目录下,是一个具有隐藏和只读属性的系统文件。它的主要职责是解析Boot.ini文件。如果你对它的理解还不是很清楚,那么下面我们就以Windows XP为例介绍NTLDR在系统引导过程中的作用。
Windows XP在引导过程中将经历预引导、引导和加载内核三个阶段,这与Windows 9X直接读取引导扇区的方式来启动系统是完全不一样的,NTLDR在这三个阶段的引导过程中将起到至关重要的作用。
预引导
在预引导阶段里计算机所做的工作有:运行POST程序,POST将检测系统的总内存以及其他硬件设备的状况,将磁盘第一个物理扇区加载到内存,加载硬盘主引导记录并运行,主引导记录会查找活动分区的起始位置。接着活动分区的引导扇区被加载并执行,最后从引导扇区加载并初始化NTLDR文件。
引导
在引导阶段中,Windows XP将会依次经历初始引导加载器阶段、操作系统选择阶段、硬件检测阶段以及配置选择阶段这四个小的阶段。
1:在初始引导加载器阶段中,NTLDR将把计算机的微处理器从实模式转换为32位平面内存模式,在实模式中,系统会为MS-DOS预留640KB大小的内存空间,其余的内存都被看做是扩展内存,在32位平面模式中系统将所有内存都视为可用内存,然后NTLDR执行适当的小型文件系统驱动程序,这时NTLDR可以识别每一个用NTFS或FAT格式的文件系统分区,至此初始引导加载器阶段结束。
2:当初始引导加载器阶段结束后将会进入操作系统选择阶段,如果计算机上安装了多个操作系统,由于NTLDR加载了正确的Boot.ini文件,那么在启动的时候将会出现要求选择操作系统的菜单,NTLDR正是从boot.ini文件中查找到系统文件的分区位置。如果选择了NT系统,那么NTLDR将会运行NTDETECT文件,否则NTLDR将加载BOOTSECT.DOS,然后将控制权交给BOOTSECT.DOS。如果Boot.ini文件中只有一个操作系统或者其中的timeout值为0,那么将不会出现选择操作系统的菜单画面,如果Boot.ini文件非法或不存在,那么NTLDR将会尝试从默认系统卷启动系统。
小提示:NTLDR启动后,如果在系统根目录下发现有Hiberfil.sys文件且该文件有效,那么NTLDR将读取Hiberfil.sys文件里的信息并让系统恢复到休眠以前的状态,这时并不处理Boot.ini文件。
3:当操作系统选择阶段结束后将会进入硬件检测阶段,这时NTDETECT文件将会收集计算机中硬件信息列表,然后将列表返回到NTLDR,这样NTLDR将把这些硬件信息加载到注册表“HKEY_LOCAL_MACHINE”中的Hardware中。
4:硬件检测阶段结束后将会进入配置选择阶段,如果有多个硬件配置列表,那么将会出现配置文件选择菜单,如果只有一个则不会显示。
加载内核
在加载内核阶段中,NTLDR将加载NTOSKRNL.EXE内核程序,然后NTLDR将加载硬件抽象层(HAL.dll),接着系统将加载注册表中的“HKEY_LOCAL_MACHINE\System”键值,这时NTLDR将读取“HKEY_LOCAL_MACHINE\System\select”键值来决定哪一个ControlSet将被加载。所加载的ControlSet将包含设备的驱动程序以及需要加载的服务。再接着NTLDR加载注册表“HKEY_LOCAL_MACHINE\System\service”下的start键值为0的底层设备驱动。当ControlSet的镜像CurrentControlSet被加载时,NTLDR将把控制权传递给NTOSKRNL.EXE,至此引导过程将结束。
小提示:如果在启动的时候按F8键,那么我们将会在启动菜单中看到多种选择启动模式,这时NTLDR将根据用户的选择来使用启动参数加载NT内核,用户也可以在Boot.ini文件里设置启动参数。
NTLDR具有向下兼容性,也就是说高版本的NTLDR可以启动低版本的Windows NT操作系统,目前最新版本的NTLDR是在Windows Server 2003 SP1附带的版本。
如果你已经安装了一个高版本的操作系统,那么如果再想安装一个低版本的操作系统,那么低版本的操作系统在安装后会出现无法进入原来高版本的操作系统的故障。问题的原因是低版本的NTLDR和NTDETECT不能识别高版本操作系统的NTOSKRNL.EXE,从而造成系统不能正常启动。

Windows内核加载器概念学习相关推荐

  1. 从零开始操作系统------MBR直操硬盘、内核加载器

    本文基于郑纲的<操作系统还原>,仅为个人学习笔记,前期的虚拟机配置等不再详细记录,其中不理解或者出错的地方还望提出意见! 从零开始操作系统------MBR直操显卡 硬盘 存储逻辑 为了更 ...

  2. 一步步编写操作系统 24 编写内核加载器

    这一节的内容并不长,因为在进入保护模式之前,我们能做的不多,loader是要经过实模式到保护模式的过渡,并最终在保护模式下加载内核.本节只实现一个简单的loader,本loader只在实模式下工作,等 ...

  3. 一种保护应用程序的方法 模拟Windows PE加载器,从内存资源中加载DLL

    暂未整理,成文见: http://hi.baidu.com/kisbuddy/blog/item/f5da581035197e4bf2de32a2.html

  4. os从启动带内核加载

    操作系统实验(真象还原) 第0章 操作系统是什么 操作系统把资源获取到后交给用户进程,而不允许用户直接访问硬件资源写一个操作系统需要了解硬件知识,这些硬件提供了软件接口,于是操作系统可以通过接口操作硬 ...

  5. 034_webpack中的加载器

    1. 通过loader打包非js模块 1.1. 在实际开发中, webpack默认只能打包处理以.js后缀名结尾的模块, 其它非.js后缀名结尾的模块, webpack默认处理不了, 需要调用load ...

  6. PE学习(六)第六章 栈与重定位表 实例栈溢出、模拟加载器加载DLL、遍历重定位表

    第六章 栈与重定位表 16bit OS 存在长调用 lcall push cs,ip    相应的iret pop ip, cs  而call/ret only focus ip register 3 ...

  7. unity 异步加载网络图片_一个非常好用的AssetBundle资源加载器

    Loxodon Framework Bundle是一个非常好用的AssetBundle加载器,也是一个AssetBundle冗余分析工具.它能够自动管理AssetBundle之间复杂的依赖关系,它通过 ...

  8. JVM篇2:[-加载器ClassLoader-]

    写本篇的动因只是一段看起来很诡异的代码,让我感觉有必要认识一下ClassLoader ----[Counter.java]------------------------- public class ...

  9. 操作系统的 (program)loader(程序加载器)

    在计算机科学中,加载器(也叫程序加载器)属于操作系统的一部分,用于加载程序(programs)和库(libraries).加载器是执行程序和代码必不可少的组件,正是它负责将程序送入内存,为程序的运行提 ...

最新文章

  1. hashMap传入参数,table长度为多少
  2. wince mysql吗_wince的数据库操作
  3. Spring 4 官方文档学习(十一)Web MVC 框架之异常处理
  4. android刷机教程视频,Android 设备刷机教程
  5. BUUCTF-Reverse:新年快乐 + 加壳与脱壳
  6. 基于Anaconda安装GPU版PyTorch深度学习开发环境
  7. boost::hana::metafunction_class用法的测试程序
  8. JAVA设计模式总结之23种设计模式
  9. Oracle 中文排序
  10. 单页面二改套后台,后台采用的是迅睿CMS框架
  11. 小程序如何吸粉以及引流
  12. STM32学习1之ADC+DMA(使用定时器触发)
  13. 使用脚本删除ios工程中未使用图片
  14. 刚看到另外一个育儿作者收入是我的3000倍
  15. python中random is not defined_Python random库使用方法及异常处理方案
  16. php 直播源,【Bilibili直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)...
  17. 打补丁更新不适用计算机,安装补丁“此更新不适用于你的计算机”解决办法
  18. 手写体识别识别(pytorch):
  19. ui设计网站资料大全,你想要的都有
  20. 英语foteball足球

热门文章

  1. 电脑的cpu是怎么制作的?
  2. bp神经网络代码_机器学习(周志华)课后习题——第五章——神经网络
  3. winxp升级win7教程_WinXP桌面右下角提示网络电脑没有插好的原因及解决方法教程一览-...
  4. 计算机组成原理——I/O设备(外部设备)、I/O接口
  5. java内存泄露分析方案
  6. 《Android开发艺术探索》自定义View中关于“HorizontalScrollViewEx”的改进
  7. CTFshow 文件包含 web79
  8. 用matplotlib的imshow显示图像,设置colorbar的颜色范围
  9. 如何避免GUIDE自动代码的Warning
  10. 【康拓展开逆康托展开】