引导加载程序:GRUB
计算机在启动的时候,首先由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的更多相关文章
- 引导加载程序之争: LILO 和 GRUB
在不考虑他们的工作或专业情况下,所有 Linux 用户都会使用的是哪个工具?引导加载程序.通过本文了解引导加载程序的工作原理,认识两个流行的引导加载程序 LILO(LInux LOader)和 GNU ...
- 如何配置Ubuntu 16.04 GRUB 2引导加载程序
正如你所知,GRUB 2 是大多数 Linux 操作系统的默认引导加载程序.GRUB 是 GRand Unified Bootloader 的缩写,它是 Linux 启动时首先要加载的一个程序,此后它 ...
- Win7下安装双系统Centos,并修复Centos引导加载程序安装在U盘上的问题
1.使用U盘安装Centos时,磁盘分区划分要注意:系统(包含Win7)只能4个主分区,所以只能在删除一个主分区或者在扩展分区的空闲分区内建立目录. 2.Centos在安装步骤的最后,引导加载程序的选 ...
- 对Bootloader(引导加载程序)的几点理解
1.在加电复位之后,大多数处理器都会从一个默认的地址处获取代码.比如MIPS结构的CPU会从0xBFC00000处取第一条指令,而ARM结构的CPU则从地址0x00000000处取第一条指令.因此,在 ...
- Linux内核和根文件系统引导加载程序
续博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令.就进入Linux内核启动阶段,与u-boo ...
- os引导程序boot 在根目录区寻找os加载程序文件loader 对应的根目录条目
[0]README 0.0) source code from orange's implemention of a os and for complete code , please visit h ...
- os引导程序boot从扇区拷贝os加载程序loader文件到内存(boot copy kernel to mem in the same method)
[0]README 0.1) 本代码旨在演示 在boot 代码中,如何 通过 loader文件所在根目录条目 找出该文件的 在 软盘所有全局扇区号(簇号),并执行内存中的 loader 代码: 0.2 ...
- PC硬件以及引导加载器
PC 硬件 本文介绍供 x86 运行的个人计算机(PC)硬件平台. PC 是指遵守一定工业标准的计算机,它的目标是使得不同厂家生产的机器都能够运行一定范围内的软件.这些标准随时时间迁移不断变化,因此9 ...
- CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法
这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...
随机推荐
- poi操作officePOI操作excel中的数据格式(日期类型)
7.3.3 POI中Excel文件Cell的类型 在读取每一个Cell的值的时候,通过getCellType方法获得当前Cell的类型,在Excel中Cell有6种类型,如表7-3所示. 表7-3 C ...
- Android下调用收发短信邮件等
Android下调用收发短信邮件等 1,调web浏览器Uri myBlogUri = Uri.parse("http://xxxxx.com");returnIt = new In ...
- IntelliJ IDEA 开发swing(一)
原文:idea开发swing(一) 最近项目组需要开发一个swing小工具,以下是开发过程. 一.创建工程: 输入工程名称,选择java module,点击next 接下来什么都不选点击finish, ...
- 《C++ Primer Plus》学习笔记1
C++ Primer Plus>学习笔记1 第二章.開始学习C++ 1.控制符endl 假设显示字符串时,在字符串中包括换行符,而不是在末尾加上endl,这样能够大大降低输入量:假设是要生成一个 ...
- jquery 中获取所有选中的checkbox的用法
以往还错误的把$("input[type='checkbox'][checked]") 是正确的用法,奇怪的是:这样用之前确实是好用的,单当我页面中的html内容超过1000行时, ...
- ORA-01403: no data found
在项目的存储过程中有这样一句话 select jgdm,jgmc into parm_mrjgdm,parm_mrjgmc From BL_KHXX where jgdm=PARM_JGDM; 每次 ...
- Swift - 短信发送功能的实现
使用MessageUI.framework框架可以实现短信发送功能,步骤如下: (1)首先判断设备是否有发送短信功能 (2)如果设备允许发送短信,创建一个MFMessageComposeViewCon ...
- [置顶] Android框架攻击之Fragment注入
为了适应越来越大的设备屏幕,Android在3.X后引入了Fragment概念,作用是可以在一个屏幕上同时显示多个Activity,以达到充分利用屏幕的目的.关于Fragment的使用说明,可以阅读& ...
- sum(case when then)(男女生的个数)
判断类似一个班级的男生和女生的人数,用sum (cese when then ) select count(er.execute_result), sum(case er.execute_result ...
- iOS学习——UI基础UIButton(七)
前面写了UIWindow.UIViewController,那些都是一些框架,框架需要填充上具体的view才能组成我们的应用,移动应用开发中UI占了很大一部分,最基础的UI实现是使用系统提供的各种控件 ...