什么参数启动顺序变化?

时间:2014-12-15 10:55:56

标签: unix boot bootloader

每种Unix风格都有相同的启动顺序代码吗?我的意思是有不同的内核版本发布不同的版本,所以一旦内核加载,是否有可能出现不同的引导序列代码?或者他们始终保持引导序列(或代码)的共同点?

编辑:我想详细了解启动过程是如何完成的。

  1. MBR在哪里找到GRUB?如何存储此信息?它是默认硬编码的吗?

  2. 是否有可用于启动顺序的块级别分区架构?

  3. GRUB如何定位内核映像?它是存储内核映像的公共空间吗?

  4. 我在网上搜索了很多;但它显示了共同的架构BIOS - > MBR - > GRUB - > Kernel - > Init

    我想知道一切的细节。我应该怎么做才能知道这一切?有什么方法可以调试启动过程吗?

    提前致谢!

1 个答案:

答案 0 :(得分:2)

首先,启动过程非常依赖于平台和内核。

关键是通常将内核映像加载到内存中并运行它,但细节可能不同:

  • 我从哪里获得内核映像? (分区上的文件?设备上固定的偏移量?我应该只将设备映射到内存中吗?)
  • 应该装什么? (只有“核心”图像?还有带附加数据的ramdisk?)
  • 应该在哪里装?是否需要额外的初始化(CPU / MMU状态,设备初始化......)?
  • 有内核参数传递吗?它们应该放在哪里供内核看?
  • 存储引导加载程序本身的配置在哪里(硬编码,分区上的文件,......)?如何加载其他模块? (像GRUB这样的引导程序本身就是小型操作系统)

不同的引导加载程序和操作系统可能会以不同的方式执行此操作。 “UNIX-like”位不相关,操作系统在内核开始运行后开始表面上是UNIXy(POSIX系统调用,init进程,POSIX用户空间......)。

即使在常见的x86 PC上,“传统BIOS”和UEFI模式之间的差异也很大(在最后一种情况下,UEFI本身可以加载并启动内核,而不涉及其他引导程序)。

使用GRUB2在BIOS模式下开始使用x86上的现代Linux发行版,基本思路是快速启动并运行一个可以处理“正常”PC抽象的系统(磁盘分区,文件系统上的文件, ...),至少保持必须处理硬编码磁盘偏移的代码。

  1. GRUB不是一个单一的程序,但它是分阶段组成的。启动时,BIOS加载并执行存储在MBR中的代码,这是GRUB的第一个阶段。由于可以存储的代码量非常有限(几百个字节),所有这些代码都是作为下一个GRUB阶段的蹦床(不知何故,它“引导GRUB”);
  2. MBR代码包含硬编码“核心图像”的第一扇区的地址;反过来,这包含从磁盘加载其余“核心映像”的代码(再次,硬编码为磁盘扇区列表);
  3. 一旦加载了核心映像,就会完成丑陋的工作,因为GRUB核心映像通常包含基本的文件系统驱动程序,所以它可以从启动分区上的常规文件加载其他配置和模块;
  4. 现在发生的事情取决于特定启动项的配置;对于启动Linux,通常涉及两个文件:内核映像和initrd

    • initrd包含“初始ramdrive”,包含在早期启动过程中(在内核安装文件系统之前)/挂载的准系统用户区;它主要包含设备检测助手,设备驱动程序,文件系统驱动程序,......允许内核能够按需加载安装“真正的”根分区所需的代码;
    • 内核映像是一个(通常是压缩的)可执行映像in some format,它包含实际的内核代码;引导加载程序在内存中提取它(遵循一些规则),将内核参数和initrd内存位置放在某个内存位置,然后跳转到内核入口点,从而内核接管引导过程;
  5. 从那里开始,“真正的”Linux启动过程开始,通常涉及加载设备驱动程序,启动init,安装磁盘等。

  6. 同样,这是所有(x86,BIOS,Linux,GRUB2) - 特定的;没有MBR的架构上的点1-2是不同的,如果直接从UEFI加载GRUB,则完全跳过;如果使用UEFI(或一些其他加载器)直接加载内核映像,则1-3不同/避免使用。如果内核映像已经捆绑了启动所需的全部内容(典型的嵌入图像),则可能不涉及initrd事物;对于不同的操作系统,第4-5点的细节是不同的(尽管基本思想通常是相似的)。并且,在嵌入式计算机上,内核可以直接放置在“魔术”位置,该位置自动映射到内存中并在开始时运行。