计算机在启动的时候,首先由BIOS中的程序执行自检,自检通过后,就根据CMOS的配置找到第一个可启动磁盘的MBR中的Boot Loader程序(一般在启动盘的第一个物理扇区,占446字节),并把控制权交给Boot Loader,由Boot Loader进一步完成操作系统内核的加载。当Boot Loader找到内核之后,就把控制权交给操作系统内核,由内核继续完成系统的启动。可以看出,Boot Loader 是计算机启动中第二个要执行的程序,它是引导操作系统的关键程序。可以引导操作系统的Boot Loader主要有LiLo、GRUB以及Windows下的MBR程序。其中,GRUB是目前使用最为广泛,并且非常优秀的一款启动引导程序。

GRUB的执行流程

GRUB引导操作系统的简要流程:
(1)如果你安装GRUB到MBR,GRUB的安装程序会把MBR的boot loader(或其他扇区boot loader)备份到Stage1。执行Stage1,Stage1的工作是载入Stage1_5。

(2)当Stage1_5加载后,stage1就可以加载Stage2,因为Stage1_5加载后,就可以认识到ext2文件系统的格式也赋予了GRUB读取文件系统目录的能力。

(3)stage2执行时,查找grub.conf,显示启动菜单供用户选择,然后根据用户的选择或默认配置加载操作系统内核,并将控制权交给操作系统内核,由内核完成操作系统的启动。

GRUB涉及到几个重要的文件: 
stage1:stage1的大小是512个字节,正是MBR的大小,但stage1的最后66个字节与mbr不同,mbr的最后66个字节分别是64个字节的分区表,和MBR标记55AA.stage1与MBR的前446,它们的内容是完全一样的.我们可以理解stage1文件是MBR中bootloader的一个备份。通常,这个文件是被装载到MBR或者启动扇区所在的分区。
stage1_5:作为stage1加载stage2的桥梁,stage1_5负责识别文件系统格式从而加载stage2,所以stage1_5往往有多个,以支持不同文件系统的读取。在安装GRUB的时候,GRUB会根据当前/boot/分区类型,加载相应的stage1_5。
stage2:stage2是放在各个分区的Boot Sector,主要作用:提供菜单、读取配置文件、连接下一个Boot Sector。

第四个是menu.lst(/boot/grub/grub.conf的链接)。grub.conf是一个基于脚本的文本文件,其中包含菜单显示的配置和各个操作系统的内核加载配置。GRUB根据grub.conf显示启动菜单,提供同用户交互界面。GRUB正是根据用户选择或默认配置和grub.conf的内核配置加载相应的内核程序,并把控制权交给内核程序,使得内核程序完成真正的操作系统的启动。

MBR、/BOOT、GRUB三者关系

MBR是硬盘上的一个扇区,包含三部分内容(引导加载程序、分区表及分隔标识,MBR总计512字节;其中引导加载程序占446个字节);为什么需要这个MBR,主要是因为BIOS太小,功能有限。当系统加电,BIOS自检后,就会将MBR Load进内存。也就意味着引导加载程序被激活,分区表信息已经加载到内存,同时也意味着对系统的控制权从BIOS过渡到GRUB。

GRUB是一个多重操作系统启动程序。用来引导不同系统。GRUB是一个系统引导加载程序,分为两个阶段,stage1用汇编语言编写,也就是MBR中的引导程序部分。①基本的硬件设备初始化(屏蔽所有的中断、关闭处理器内部指令/数据cache 等)。②为加载 Boot loader 的Stage2 准备空间。③如果是从某个固态存储媒质中,则拷贝 Bootloader 的stage2 到RAM 空间中。④设置好堆栈。⑤跳转到 stage2的C 程序入口点。

GRUB引导加载程序的stage2,通常用C语音编写,这个阶段的任务有:①初始化本阶段要使用到的硬件设备。②检测系统内存映射。③将kernel 映像和根文件系统映像从flash 上读到RAM 空间中。④为内核设置启动参数⑤调用内核。它通常保存在/boot/grub/中。当我们启动系统进入GRUB界面时,会看到有选择信息,如果我们自己编译了系统内核的话,你可以选择从某个内核启动。同时要注意的是GRUB的配置文件和内核在/boot分区。

从前面分析我们可以看出,/BOOT和MBR不存在包含关系。GRUB第一阶段需要去MBR中去读引导程序,GRUB第二阶段需要到/boot分区读系统内核和配置文件。

通过上面分析,可以理解为什么双系统,删除Linux系统,会导致开机两个系统都打不开。

引导加载程序:GRUB的更多相关文章

  1. 引导加载程序之争: LILO 和 GRUB

    在不考虑他们的工作或专业情况下,所有 Linux 用户都会使用的是哪个工具?引导加载程序.通过本文了解引导加载程序的工作原理,认识两个流行的引导加载程序 LILO(LInux LOader)和 GNU ...

  2. 如何配置Ubuntu 16.04 GRUB 2引导加载程序

    正如你所知,GRUB 2 是大多数 Linux 操作系统的默认引导加载程序.GRUB 是 GRand Unified Bootloader 的缩写,它是 Linux 启动时首先要加载的一个程序,此后它 ...

  3. Win7下安装双系统Centos,并修复Centos引导加载程序安装在U盘上的问题

    1.使用U盘安装Centos时,磁盘分区划分要注意:系统(包含Win7)只能4个主分区,所以只能在删除一个主分区或者在扩展分区的空闲分区内建立目录. 2.Centos在安装步骤的最后,引导加载程序的选 ...

  4. 对Bootloader(引导加载程序)的几点理解

    1.在加电复位之后,大多数处理器都会从一个默认的地址处获取代码.比如MIPS结构的CPU会从0xBFC00000处取第一条指令,而ARM结构的CPU则从地址0x00000000处取第一条指令.因此,在 ...

  5. Linux内核和根文件系统引导加载程序

    续博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令.就进入Linux内核启动阶段,与u-boo ...

  6. os引导程序boot 在根目录区寻找os加载程序文件loader 对应的根目录条目

    [0]README 0.0) source code from orange's implemention of a os and for complete code , please visit h ...

  7. os引导程序boot从扇区拷贝os加载程序loader文件到内存(boot copy kernel to mem in the same method)

    [0]README 0.1) 本代码旨在演示 在boot 代码中,如何 通过 loader文件所在根目录条目 找出该文件的 在 软盘所有全局扇区号(簇号),并执行内存中的 loader 代码: 0.2 ...

  8. PC硬件以及引导加载器

    PC 硬件 本文介绍供 x86 运行的个人计算机(PC)硬件平台. PC 是指遵守一定工业标准的计算机,它的目标是使得不同厂家生产的机器都能够运行一定范围内的软件.这些标准随时时间迁移不断变化,因此9 ...

  9. CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法

    这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...

随机推荐

  1. POJ Octal Fractions(JAVA水过)

    题目链接:id=1131" target="_blank">CLICK HERE~ 尽管java一下模拟水过,可是我看到别人的一段奇妙代码,贴出和大家共享. imp ...

  2. AsyncTask简单入门

    关系: java.lang.Object    ↳    android.os.AsyncTask<Params, Progress, Result> 概述: AsyncTask是Andr ...

  3. Android的BUG(四) - Android app的卡死问题

    做android,免不了要去运行一些跑分程序,常用的跑分程序有quadrant(象限),nbench,安兔兔等.作为系统工程师,对这些跑分 程序都非常的不屑,这个只能是一个不客观的参考,但客户都喜欢拿 ...

  4. 功能间(两个form)数据交互的编程方法

    功能间数据交互的编程方法 现在框架具有在两个打开的功能之间进行通讯的机制.通讯是指,一个功能调用另外一个功能的方法,或者传递一些数据,并得到返回结果.比如处置单打开结算单,结算单保存后,将结算单号反填 ...

  5. 利用xshell密钥管理服务器远程登录+VIM dd命令操作之伤之再伤

    1.打开Xshell界面,中文界面方便操作,菜单栏:工具——新建用户密钥生成向导 2.密钥类型选择RSA,密钥长度选择2048位,单击下一步继续: 3.很快生成公钥对,单击下一步继续: 4.密钥名称可 ...

  6. 自己用js写的两个日历控件

    前一阵写了两个日历控件,做了简单的封装,发出来共朋友们参考. 第一个日历控件,条状的日历. (使用方法:调用initBarTime(id,evn),第一个参数是要渲染div的id,第二个参数是点击日期 ...

  7. 02-Foundation-NSMutableString、NSNumber、NSValue、NSDate、NSArray

    目录: 一.NSMutableString可变字符串 二.NSNumber数字对象 三.NSValue 四.NSDate日期对象 五.NSArray数组对象 回到顶部 一.NSMutableStrin ...

  8. StrPos,StrScan,

    Delphi提供的字符串函数里有一个Pos函数,它的定义是: function Pos(Substr: string; S: string): Integer; 它的作用是在字符串S中查找字符串Sub ...

  9. [poj 1265]Area[Pick定理][三角剖分]

    题意: 给出机器人移动的向量, 计算包围区域的内部整点, 边上整点, 面积. 思路: 面积是用三角剖分, 边上整点与GCD有关, 内部整点套用Pick定理. S = I + E / 2 - 1 I 为 ...

  10. [Android系列—] 1. Android 开发环境搭建与Hello World

    前言 開始之前先熟悉几个名词: SDK -- Software Development Kit, 软件开发工具包.这个词并不陌生, JDK,就是Jave Development Kit,相同对于And ...