标签:linux内核
具体要求如下:
Grub的源码分析:Grub如何支持多个系统和内核的启动选择(MultiBoot机制)。
一.GRUB 简介(介绍主流的系统管理程序grub)
什么是GRUB;
GNU GRUB 是一个多重操作系统启动管理器。GNU GRUB 是由GRUB(GRand Unified Bootloader) 派生而来。GRUB 最初由Erich Stefan Boleyn 设计和应用;
“boot loader”是计算机启动后第一个运行的软件。它负责加载一个操作系统的内核,并把控制权交给内核。内核则负责剩下的初始过程。
GRUB 一个很重要的特色就是灵活性;GRUB 可以识别文件系统和二进制格式的内核,所以你可以加载任何操作系统,而不需要记录内核在
磁盘上的物理位置。
二.GRUB 的现状
目前 GRUB 分成 GRUB legacy 和 GRUB 2。版本号是 0.9x 以及之前的版本都称为 GRUB Legacy ,从 1.x 开始的就称为 GRUB 2。目前
GRUB Legacy 已经停止开发了,只是出于一个 bug fix 的状态,不再增加新的功能了,所有的开发都转移到 GURB 2 之上了。
三.GRUB 和 stage 文件(grub1)文件说明
GRUB 含有几个 images 文件,两个基础(必需的)stages 文件(stage1和 stage2),可选的 stage(也称为 stage1.5),和两个网络引导的images 文件
nxgrub 和 pxegrub)。stage1 是用于引导 GURB 的一个必须的映象文件。通常它是被嵌入到 MBR。或者一个分区的引导扇区之中。因为 PC 的引导扇区是
512 字节,所以 stage1 也是 512 字节。stage1 的作用就是从一个本地磁盘加载 stage 2 或者 stage 1.5 。因为大小的限制,stage1 对 stage2 或者
stage 1.5 的位置进行编码,也就是说,stage1 是无法识别文件系统格式的。stage2 是 GRUB 的核心映象。它几乎处理所有的事情(除了加载它自己),
通常可以把他放在文件系统上,但不是必须的。一旦你执行了 grub-install 安装了 boot loader ,stage1 文件就不是必须的,可以把它移动到任意位置,因为它已经被嵌入到 MBR 或者 PBR 了。stage1和stage2 文件一般位于 /boot/grub/ 目录下,在这个目录下还有很多 stage 1.5 的文件,而且都是以文件系统格式命名的。它们的目的是在 stage1 和 stage2之间搭建一个桥梁,也就是 stage 1 加载 stage 1.5, stage 1.5 加载 stage2。stage1 和 stage 1.5 的不同之处是 stage1 无法识别文件系统,stage 1.5 可以。因为 Stage2 太大了,无法被嵌入到某个固定的区域,而 Stage1.5可以安装在 MBR 之后的位置。
四.多重操作系统引导管理器及工作原理
系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载、传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化及启动过程则完全由内核来控制完成;
在X86 架构的机器中,Linux、BSD 或其它Unix类的操作系统中GRUB、LILO 是大家最为常用,应该说是主流;
五.启动过程
计算机启动后,BIOS将寻找第一个可启动的设备(通常为硬盘),而后从MBR中载入启动程序,然后把控制交给这段代码。MBR位于硬盘的前512字节内。
GRUB具有两种不同的启动方法。一个是直接载入一个操作系统,而另一个是链式载入另一个启动载入器,它然后将真正载入一个操作系统。概括而言,前 者是更期望的,因为你不需要安装或维护其它启动载入器,并且GRUB足够灵活,能从任意硬盘、分区载入一个操作系统。不过,后者有时也是需要的,因为 GRUB不是天然地支持所有现存的操作系统。
GRUB 第一版本
GRUB的步骤1包含在MBR中。由于受MBR的大小限制,步骤一所做的几乎只是装载GRUB的下一步骤(存放在硬盘的其它位置)。步骤1既可以直接装载步骤2,也可以装载步骤1.5:GRUB的步骤1.5包含在MBR后面的30千字节中。步骤1.5载入步骤2。
当步骤2启动后,它将呈现一个界面来让用户选择启动的操作系统。这步通常采用的是图形菜单的形式,如果图形方式不可用或者用户需要更高级的控制,可以使用GRUB的命令行提示,通过它,用户可以手工指定启动参数。GRUB还可以设置超时后自动从某一个内核启动。
GRUB 第二版本
与GRUB 第一版相似的是,boot.img像步骤1一样在MBR或在启动分区中,但是,它可以从任何LBA48地址的一个扇区中读取,它(boot.img)将读取core.img(产生于diskboot.img)的第一个扇区以用来后面读取core.img的剩余部分。core.img正常情况下跟步骤1.5储存在同一地方并且有着同样的问题,可是,当他被移动到一个文件系统或一个纯粹的分区时会比在步骤1.5移动或删除引起更少的麻烦。 一旦完成读取,core.img会读取默认的配置文件和其他需要的模块。
当GRUB启动后
一旦选择了启动选项,GRUB把选择的内核载入内存并把控制交给内核。在此步骤中,对于Windows之类不支持多启动标准的操作系统,GRUB也 可以通过链式启动把控制传给其它启动器。在这种情况下,其它操作系统的启动程序被GRUB保存了下来;与内核不同,其它操作系统如同直接自MBR启动。类 似Windows的启动菜单,也许是另一个启动管理器,它允许在多个不支持多启动的操作系统中做进一步的选择。(在已有Windows的系统上面,或者包 含多个Windows版本的系统上安装现代的Linux而不修改原操作系统,即属于这类情况。)
六.Grub如何支持多个系统
6.1如何使用GRUB直接启动一个OS
多重启动是GRUB支持的原有格式。出于方便的缘故,还有对Linux,FreeBSD,NetBSD及OpenBSD的支持。如果你希望启动其它操作系统,你将要链式载入它们
运行命令行启动
链式载入一个OS
不支持多重启动,并且在GRUB中没有特殊支持的操作系统(存在对Linux,FreeBSD,NetBSD及OpenBSD的特殊支持)必须被链式载入,这涉及载入另一个启动载入器,然后在实模式中跳转至它。
链式载入器命令用于这个目的。通常也需要载入某些GRUB模块来设定合适的根设备。综合起来,我们得到像这样结论,对于在第一个硬盘的第一个分区上的一个Windows系统:
menuentry"Windows" {
insmod chain
insmod ntfs
set root=(hd0,1)
chainloader +1
}
在具有多个硬盘的系统上,可能要求一个额外的变通方案。
链式载入仅在PCBIOS及EFI平台上支持。
6.2GNU/Linux
从GRUB启动GNU/Linux相对简单,因为它有点类似于启动一个多重启动兼容OS。
1. 设置 GRUB的根设备为与GNU/Linux的相同。命令search --file --set /vmlinuz或类似的命令可能可帮助你。
2. 使用命令linux载入内核:
grub> linux /vmlinuz root=/dev/sda1
如果你需要指定某些内核参数,只要把它们附加到命令上。例如,把‘acpi’设置到‘off’,要这样做:
grub> linux /vmlinuz root=/dev/sda1 acpi=off
至于可用选项的完整信息,参考Linux源代码树中的文档。
在linux命令里,GRUB使用32位协议。在这个协议中某些BIOS服务,象APM或EDD不可用。在这种情况下,你需要使用linux16:
grub> linux16 /vmlinuz root=/dev/sda1 acpi=off
3. 如果你使用一个initrd,在linux后执行命令initrd:
grub> initrd /initrd
如果你使用linux16,你需要使用initrd16:
grub> initrd16 /initrd
4. 最后,运行命令boot。
注意:如果你使用一个initrd,并向内核指定‘mem=’选项,使得它使用少于真实大小的内存,你将也要向GRUB指定相同的内存大小。为了使 GRUB知道这个大小,在载入内核之前,运行命令uppermem。
6.3 DOS/Windows
GRUB不能直接启动DOS或Windows,因此你必须链式载入它们。不过,它们的启动载入器有某些关键性的缺陷,因此仅链式载入它们可能不能工作。为了对付这个问题,GRUB为你提供了两个协助函数。
如果你已经在第一个硬盘以外安装了DOS(或Windows),你必须使用硬盘交换技术,因为OS只能从第一个硬启动。GRUB所使用的变通方案是命令drivemap,象这样:
drivemap -s (hd0) (hd1)
这在你的第一个及第二个硬盘间执行一个虚拟交换。
注意:仅当DOS(或Windows)使用BIOS来访问交换硬盘时,这才起作用。如果OS为硬盘使用一个特殊的驱动器,这可能不能工作。
如果你在硬盘上安装了多个DOS或Windows,会引起另一个问题,因为如果有多个用于DOS/Windows的主分区,会引起混淆。毫无疑问你应该避免这样做,不过如果你想这样做,有一个解决方案。使用分区隐藏/解隐藏技术。
如果GRUB隐藏了一个DOS(或Windows)分区,DOS(或Windows)将忽略 这个分区。如果GRUB解隐藏一个DOS(或Windows)分区,DOS(或Windows)将检测到这个分区。这样,如果你已经在第一个硬盘的第一、 第二分区上安装了DOS(或Windows),并且希望从第一个分区上启动,像下面那样做:
parttool (hd0,1) hidden-
parttool (hd0,2) hidden+
set root=(hd0,1)
chainloader +1
parttool ${root} boot+
Boot
标签:linux内核
原文地址:http://blog.csdn.net/u013012494/article/details/39178295