linux-kernel - Linux 内核引导方法 预构建的 rootfs

标签 linux-kernel embedded-linux boot bootloader

我正在学习 linux 内核启动过程并尝试在我的 beagleboard xM 上安装 linux。我遇到了两种使用 SD 卡的方法。 1. 将 MLO、initrd、uboot.bin 和 uImage 放在一个分区中。 2. 在一个分区中有 MLO、uboot.bin 和 uImage,在第二个分区中有一个预构建的 rootfs (Angstrom)。

在第一种方法中,initrd 如何在第二个分区上转换为完整的文件系统。当 uboot 从 uImage 中提取内核并将其粘贴到第二个分区时,内部会发生什么。哪些目录将被初始化 rootfs 修改。内核的init进程是如何调用的。

最佳答案

一般来说,Beagleboard-XM 中的启动顺序是这样的:

固件 -> MLO -> uboot.bin -> uImage -> initrd(可选) -> rootfs

initrd 本身是一个简单的基于 RAM 的文件系统。一般用于挂载实际的文件系统。挂载 rootfs 所需的一些模块被捆绑到 initrd 中。挂载 rootfs 后,将清理 initramfs。如果挂载 rootfs 所需的功能内置于内核 (uImage) 本身,那么就不需要 initrd。正如我之前所说,initrd 是一个简单的基于 RAM 的文件系统。这意味着如果您将其用作您的文件系统,您写入的任何内容都不会被保留。一些嵌入式应用程序实际上使用它作为它们的 rootfs。

现在回答你的问题,

2号分区上的initrd是如何变成一个完整的文件系统的?

最初 u-boot 将内核 (uImage)、initrd 加载到 RAM 上并将适当的命令行参数传递给内核。一旦 u-boot 将控制权移交给内核,它首先初始化驱动程序和其他模块,最后寻找 initrd。 initrd 通常作为 cpio 镜像。然后内核将其解压缩并查找“init”。 init 处理一些事情然后挂载 rootfs。对于 initrd,没有第二个分区这样的东西。它驻留在 RAM 上。

当 uboot 从 uImage 中提取内核并将其粘贴到第二个分区时,内部发生了什么?

同样,对于 uImage,没有第二个分区这样的东西。 uImage 是 u-boot 可以理解的格式。 u-boot 首先将 uImage 加载到 RAM 上,在实际将控制权交给内核之前,它会从 uImage 中提取内容,将二进制文件移动到 RAM 中的预定义位置,然后将控制权交给内核。与 initrd 类似,内核本身也驻留在 RAM 上。

init rootfs 的哪些目录会被修改?

没有目录被修改。但是,是的,其中一些已安装,例如 procfs、sysfs 等。

内核的init进程是如何调用的?

内核如何执行init请引用init/main.c下的kernel_init()函数(引用http://lxr.free-electrons.com/source/init/main.c#L871)。

我附上了其中的一个简单代码片段:

if (!try_to_run_init_process("/sbin/init") ||
    !try_to_run_init_process("/etc/init") ||
    !try_to_run_init_process("/bin/init") ||
    !try_to_run_init_process("/bin/sh"))
    return 0;

panic("No working init found.  Try passing init= option to kernel. "
      "See Linux Documentation/init.txt for guidance.");

因此,内核在这些默认路径中搜索 init 二进制文件。如果找不到,内核就会崩溃!

希望这对您有所帮助。

关于linux-kernel - Linux 内核引导方法 预构建的 rootfs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24988532/

相关文章:

memory-management - RAM 在 lowmem 和 highmem 之间分配

embedded-linux - 有没有办法在不修改 Yocto 的情况下为机器 ID 创建链接?

linux - 交叉编译 node.js 到 MIPS 24Kc V5.0

linux - 使用virsh和qemu创建虚拟机有什么区别?

linux - irq 在 linux 内核中禁用了 api

android - 为 android 4.1 设备编译和构建 “iw”?

c - 编译内核模块时如何解决函数名冲突

windows - 内核模式驱动程序可以阻止 Windows 系统启动吗?

html - 多个媒体查询不起作用

linux-kernel - 在 QEMU 上引导 RPI 3 的自定义 64 位内核