内核启动过程

具体要求如下:

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

时间: 2024-10-29 19:11:24

内核启动过程的相关文章

轻松识破linux内核启动过程中的“”套路“”

内核启动流程相关的内容让很多热爱linux的小伙伴既爱又恨,因为这是了解linux系统基本构造的良好过程同时由于其本身复杂且底层,脑子中的脉络不是很清晰,本文就总结了一些优秀博文,以自己的理解来解构一下. 本文的环境是CentOS 6.8, 基本过程: 庖丁解牛: 1.POST BIOS的功能由两部分组成, 步骤1:上电自检POST(Power-on self test),主要负责检测系统外围关键设备(如:CPU.内                 存.显卡.I/O.键盘鼠标等)是否正常.例如,

linux内核启动过程学习总结

下面是学习linux内核启动过程的记录 平台是:powerpc mpc8548 + linux2.6.23 内核 通用寄存器的作用r0 :在函数开始时使用r1 :存放堆栈指针,相当于ia32架构中的esp寄存器r2 :存放当前进程的描述符的地址r3 :存放第一个参数和返回地址r4-r10 :存放函数的参数r11 :用在指针的调用和当前一些语言的环境指针r12 :用于存放异常处理r13 :保留做为系统线程IDr14-r31 :作为本地变量,具有非易失性 Linux启动过程描述 第一步:使用Boot

跟踪内核启动过程CONFIG_DEBUG_LL【转自】

转自:http://bbs.chinaunix.net/thread-3642079-1-1.html 最近在调试Linux内核,跟踪启动过程.发现在没有turn on mmu之前,可以使用物理地址,通过向串口Fifo丢数据的方式输出调试信息.但是代码一旦运行到开启mmu,在汇编阶段,mmu只做了物理内存的映射,并没有映射io,所以就无法访问串口了. 此时应该通过串口输出的数据都保存在串口缓冲池里,直到在c语言阶段,建立io映射并初始化控制台后才进行输出. 但是,如果我想实时跟踪内核启动过程,应

Linux移植之内核启动过程引导阶段分析

在Linux移植之make uImage编译过程分析中已经提到了uImage是一个压缩的包并且内含压缩程序,可以进行自解压.自解压完成之后内核代码从物理地址为0x30008000处开始运行.下面分析在进入C之前内核做的一些工作,以下是内核启动过程中打印出来的信息,其中Uncompressing Linux就是在自解压代码.make uImage编译的最后也给出了链接脚本arch/arm/kernel/vmlinux.lds,以及链接的顺序arch/arm/kernel/head.o 是第一个.

第七章——Windows内核基础-内核理论基础(内存空间布局,Windows与内核启动过程)

1.内存空间布局 X86系统支持32位寻址,因此支持2^32=4GB的虚拟内存空间,windwos系统的内存主要分为内核空间和应用层空间 每部分占2GB,其中包括一个64KB的NULL空间以及非法区域. windows内存的逻辑地址分为两部分: 段选择符和偏移地址,CPU在进行地址翻译的时候,先通过分段机制计算出一个线性地址,在通过页表机制将线性地址映射到物理地址,再从物理内存中读取数据和指令 X64的内存布局与X86的内存布局类似,X64下存在一些空洞,并且X64的最大寻址空间为2^64KB的

linux内核启动过程中__set_up的作用!

__set_up是一个宏 #define __setup(str, fn) \ __setup_param(str, fn, fn, 0) #define __setup_param(str, unique_id, fn, early) static char __setup_str_##unique_id[] __initdata = str; static struct obs_kernel_param __setup_##unique_id __attribute_used__ __att

Linux内核分析 实验三:跟踪分析Linux内核的启动过程

贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 1.打开shell,输入启动指令,内核启动完成后进入menu程序,支持三个命令help.version和quit. 2.然后使用gdb跟踪调试内核,输入命令qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 3.按住

Linux内核启动及根文件系统载入过程

上接博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令,就进入Linux内核启动阶段.与u-boot类似,普通Linux内核的启动过程也能够分为两个阶段,但针对压缩了的内核如uImage就要包含内核自解压过程了.本文以linux-2.6.37版源代码为例分三个阶段来描写叙述内核启动全过程.第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式.使能MMU.设置一级页表等,而第三阶段则主要为

Linux内核启动及文件系统加载过程

上接博文<u-boot之u-boot-2009.11启动过程分析> 当u-boot开始执行bootcmd命令,就进入Linux内核启动阶段,与u-boot类似,普通Linux内核的启动过程也可以分为两个阶段,但针对压缩了的内核如uImage就要包括内核自解压过程了.本文以项目中使用的linux-2.6.37版源码为例分三个阶段来描述内核启动全过程.第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式.使能MMU.设置一级页表等,而第三阶段则主要为C代码,包括内核初始化的全部工作