5.2. 从闪存启动

虽然 Linux 最初是使用 NFS 文件系统启动的,但这还不够。对于实际的现场产品,我们需要 Linux 从一个独立的设备启动,完全不需要网络。我们决定创建一个特殊的镜像,称为 initrd,它本质上是一个包含压缩文件的 Linux 内核。压缩文件包含一个 Linux 文件系统。该文件系统在启动时被解压到 ramdisk,并挂载为根文件系统。

在启动过程中,引导加载程序将内核镜像重定位到地址零 - 这没问题,并将 initrd 部分重定位到更高的地址。initrd 被重定位到的区域没有映射到我们的内核内存中,我们得到的只是一个内核错误(访问坏区域)。在修改引导加载程序将 initrd 重定位到不同的地址后,一切都正常了,Linux 成功启动。

Tip

如果你的板子有一些 NVRAM 内存,将其用于引导加载程序目的是一个好主意。在为我们的 NVRAM 内存编写了一个模块之后(超出本文范围),我们修改了引导加载程序,以便将内核命令行和 MAC 地址保存在 NVRAM 中。当引导加载程序启动时,它会检查 NVRAM,如果它已初始化(通过某个魔数),则引导加载程序使用在那里写入的命令行。否则,引导加载程序会恢复为默认命令行,允许用户编辑它。