当前位置: 首页 > Linux

Grub学习笔记

时间:2023-04-06 20:03:56 Linux

前几天装系统的时候,先装了ubuntu,再装了windows,导致最后无法加载ubuntu,easybcd引导系统也不尽如人意;后来接触到grub,觉得是个神奇的东西,研究了一下。最后通过大神Bean_lee的博客,对Grub有了最深刻的了解。在这里推荐给大家,http://blog.chinaunix.net/uid-24774106-id-3497929.html  GRUB(GRandUnifiedBootloader)是一个来自GNU项目的多操作系统引导程序,是一个多-操作系统启动管理器。用于引导不同的系统,比如windows,linux  既然是bootloader,那我们看看它在什么地方。(盗图,M.TimJones在InsideLinuxbootprocess中绘制)    Grub的工作分为两个阶段,图中的stage1和stage2。但是在实际应用中,其实还有第三个阶段:stage1.5,下面给大家揭晓。  stage1、stage1.5、stage2其实是三张图片,依次加载运行;那么为什么要将它们分成三个图像呢?制作一张图片岂不是简单而愉快?  可能要看BIOS的源码才知道原委。  我没看过BIOS的源码,但我猜一定是因为BIOS会在最后把MBR的内容搬到内存中运行,但是MBR只有512Bytes的空间,这是不足以存储所有图像,因此必须分为三个阶段。  这里要补充一下MBR的知识:  MBR,全称MasterBootRecord,也就是硬盘的主引导记录。  为了方便理解,一般把MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序、分区表和分离标志),也就是上面说的主开机记录;而狭义的MBR仅指bootloader。  硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三部分组成,主引导程序、硬盘分区表DPT(DiskPartitiontable)和分区有效标志。在总共512字节的主引导扇区中,主引导程序(bootloader)占用了446字节。第二部分是Partitiontablearea(分区表),即DPT,占64字节。硬盘有多少个分区?并且其中记录了每个分区的大小。第三部分是幻数,占2个字节,固定为0xAA55或0x55AA,视处理器类型而定。如果是小端模式处理器(如Intel系列),则值为0xAA55;如果是big-endian模式的Processor(比如Motorola6800),这个值为0x55AA。    所以stage1放在了MBR,BIOS把它移到0x7c00开始执行,那么它会做什么呢?  这512字节代码的作用是将0柱面、0磁道、2扇区的512字节拷贝复制到0x8000,进行预测细节。请参考  放在0柱面0磁道,扇区2自然是stage1.5(准确的说是stage1.5的一部分),大小也是512字节。存在找到/boot/grub/stage2,stage2有文件在系统中;我们知道stage1阶段没有os,没有文件系统的概念;识别文件系统的工作由stage1.5完成。但是,一个只有512bytes大小的程序是无法完成对文件系统的操作的。它只是一个介绍,它的作用是将LBA扇区号2(0柱面0磁道3扇区)开始的几个扇区复制到内存中,而后面的部分才是真正操作文件系统的部分。  但是文件系统有几千万个,我们不可能把文件系统的所有功能文件都放在磁盘的扇区里,那怎么办呢?当grub执行设置时,它可以识别引导设备的文件系统。比如我们的是ext4文件系统,那么只需要将ext4部分的e2fs_stage1_5放入扇区即可。  至此,stage1.5已经找到stage2,stage2可以开始加载操作系统了。所以,最后总结一下盗用:  1。MBR代码部分与/boot/grub/stage1部分??相同。这部分二进制文件是从grub源代码中的/stage1/stage1.S编译而来的。所谓的stage1只有一个功能,就是把磁盘第二扇区的内容加载到内存  2中。第二个扇区的内容与/boot/grub/e2fs_stage1_5文件的前512个字节相同。部分内容编译自grub源码/stage2/start.S,而这个start.S的作用是将磁盘的第3扇区到第N扇区加载到内存中,N的个数取决于文件系统支持代码的大小。  3.文件系统支持代码进入内存后,我们就不需要直接调用INT13来加载扇区内容了。我们有一个文件系统,我们可以直接操作文件。然后直接操作/boot/grub/stage2等比较大的文件即可。