我试图从您按下电源按钮的那一刻起了解整个机器的启动过程。从引导加载程序到 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
Run Code Online (Sandbox Code Playgroud)
这在系统状态和内存方面实际上做了什么?我知道 Grub 的任务是“加载和运行内核”,它有自己的一组模块来访问设备(或网络)上的文件以获取它们。在这里insmod
的例子中s, set root
and search
- 但这只是从 Grub 的角度来看,并没有与内核共享,对吗?
我还猜测 Grub 正在将内核的(副本?)加载到内存(linux
command)中并启动它以开始执行。(显然是两个不同的步骤 - 那么,如何?)给定的参数可以在内核中读取并解释(这是一个映射到内存某处的大字符串吗?)并提供安排所请求事物的选项。
我也看到了这个initrd
选项。这指向我的 gzip 压缩 initramfs,需要引导由root=
. 但是这个initramfs是如何提供给内核的呢?它不会传递任何内存地址到它可以加载它的地方,也不能访问它本身,因为它在内核启动之前已经加载。一些内核文档说这个 initramfs 文件系统“设备”可以通过 访问/dev/ram0
,但我不知道它是如何成为一个可访问的设备文件的。我猜我没看到水下发生了什么。
我也没有看到这与其他引导加载程序有什么关系,包括嵌入式平台,例如使用 U-boot/Coreboot。这是否与 Grub 做同样的事情(相同的标准内存地址?)以及在加载内核/initrd 方面这些与 Grub 相比在多大程度上? …