Linux内核如何访问其分配的initramfs / initrd?


8

从您按下电源按钮开始,我试图了解整个计算机的启动过程。从引导加载程序到initramfs阶段,有一件我不太了解的东西。

给定此条目的Grub配置,取自最近的Ubuntu默认安装:

insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo    'Loading Linux x.y.z ...'
linux   /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset 
echo    'Loading initial ramdisk ...'
initrd  /initrd.img-x.y.z

就系统状态和内存而言,这实际上是做什么的?我知道Grub的任务是“加载并运行内核”,并且它有自己的模块集来访问设备(或网络)上的文件以获取它们。在这里insmod的示例中- set rootsearch-但这只是从Grub的角度出发,并且不与内核共享,对吗?

我还猜测到Grub正在将内核加载(副本?)到内存(linuxcommand)并踢它以开始执行。(显然有两个不同的步骤-那么,怎么做?)可以在内核中读取并解释给定的参数(这是一个大字符串映射到内存中的某个地方吗?),并提供了安排所请求内容的选项。

我也看到了这个initrd选项。这指向我的gzip压缩的initramfs,它是启动所指定的实际根设备所需的root=。但是如何将这个initramfs提供给内核?它没有传递任何内存地址到可以加载它的位置,也不能访问它本身,因为它在内核启动之前就已经加载了。一些内核文档说,可以通过访问该initramfs文件系统“设备” /dev/ram0,但是我不知道它如何成为可访问的设备文件。我想,在水下看不见的东西正在发生。

我也看不到这与其他引导加载程序(包括嵌入式平台)之间的关系,例如使用U-boot / Coreboot。这是否与Grub(相同的标准内存地址)做相同的事情,并且在加载内核/初始化时,这些与Grub相比有多大?

只是为了澄清我的问题,我认为我确实理解了为什么存在不同的引导阶段以及发生了哪些过渡,但是我看不到它们是如何发生的以及每个阶段的确切职责是什么。我觉得我错过了一些“标准”,所有这些都归结为这些标准。

我希望对此有所解释。


注意boot序列末尾的隐式命令。我不确定它在Grub中到底是做什么的,但是如果您使用Grub命令行手动输入这些命令,则需要这样做,boot否则它将永远停留在grub>(或至少直到您感到无聊并关闭计算机电源为止) )。前面的命令“仅”设置了一个环境。
CVn 2012年

@MichaelKjörling根据我现在的理解,boot将使CPU跳转到加载的内核地址(开始执行)。对于菜单项,这是隐式定义的。看到这个
gertvdijk 2012年

Answers:



6

引导加载程序将initrd存储到内存中的某个位置,并告诉内核initrd映像的内存地址。大多数现代linux系统使用dracut来使用initramfs方案,它实际上是cpio归档文件(而不是磁盘映像),在执行后不久将其解压缩到内核创建的tmpfs文件系统中。


我走了那么远;但是引导程序如何告知内核内存中的位置?内核在哪里检索该内存地址?
gertvdijk 2012年

3
@gertvdijk看一下kernel.org/doc/Documentation/x86/boot.txt,它描述了引导程序如何与内核通信,即引导程序还必须提供内核参数等。
Ulrich Dangel

@UlrichDangel不错!正是我想要的。显然,它是描述所有内容的特定于硬件的协议(在本例中为x86)。用简短的描述作为答案写出来,我会接受的。
gertvdijk 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.