从您按下电源按钮开始,我试图了解整个计算机的启动过程。从引导加载程序到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 root
和search
-但这只是从Grub的角度出发,并且不与内核共享,对吗?
我还猜测到Grub正在将内核加载(副本?)到内存(linux
command)并踢它以开始执行。(显然有两个不同的步骤-那么,怎么做?)可以在内核中读取并解释给定的参数(这是一个大字符串映射到内存中的某个地方吗?),并提供了安排所请求内容的选项。
我也看到了这个initrd
选项。这指向我的gzip压缩的initramfs,它是启动所指定的实际根设备所需的root=
。但是如何将这个initramfs提供给内核?它没有传递任何内存地址到可以加载它的位置,也不能访问它本身,因为它在内核启动之前就已经加载了。一些内核文档说,可以通过访问该initramfs文件系统“设备” /dev/ram0
,但是我不知道它如何成为可访问的设备文件。我想,在水下看不见的东西正在发生。
我也看不到这与其他引导加载程序(包括嵌入式平台)之间的关系,例如使用U-boot / Coreboot。这是否与Grub(相同的标准内存地址)做相同的事情,并且在加载内核/初始化时,这些与Grub相比有多大?
只是为了澄清我的问题,我认为我确实理解了为什么存在不同的引导阶段以及发生了哪些过渡,但是我看不到它们是如何发生的以及每个阶段的确切职责是什么。我觉得我错过了一些“标准”,所有这些都归结为这些标准。
我希望对此有所解释。
boot
将使CPU跳转到加载的内核地址(开始执行)。对于菜单项,这是隐式定义的。看到这个。
boot
序列末尾的隐式命令。我不确定它在Grub中到底是做什么的,但是如果您使用Grub命令行手动输入这些命令,则需要这样做,boot
否则它将永远停留在grub>
(或至少直到您感到无聊并关闭计算机电源为止) )。前面的命令“仅”设置了一个环境。