1

我正在 PicoZed 板(ARM CortexA9 内核)上创建一个可启动的 Linux 系统,但我遇到了一个“限制”,我认为这并不是真正的限制(我觉得这是另一个伪装成局限性)。

我通过在 JTAG 引导模式下启动系统来引导;在板子上电后,我使用 xmd 调试器将 u-boot 放入系统的 RAM 中,然后运行它。

接下来,我将内核 (uImage)、gzip'd initramfs 映像和设备树放入内存中。最后,我告诉 u-boot 使用 bootm 引导系统,并使用三个参数指出所有映像的内存位置。

所有这些都有效,我设法启动了 Linux + 用户空间。但是,我需要增加 initramfs,这就是我遇到问题的地方。

工作图像正好是 16MiB。我尝试将其设置为 24MiB(每次尝试启动时从头开始完全重新生成),但是在内核加载并尝试查找 init 之后,内核报告文件系统故障并失败。不应该有任何重叠,但以防万一我试着移动一些东西,但同样的问题发生了。

在搜索了一些提示后,我在论坛上看到有人说图像需要放置在 16MiB 对齐(我认为这不是真的,但我还是尝试了它,但它没有得到一个工作系统)。另一篇文章声称图像必须与其尺寸对齐(我再次认为这不是真的,但我也尝试过,但没有改变)。还有一篇文章声称如果 initramfs 映像越过 __init 结束边界就会发生这种情况,并且将 initramfs 映像牢固地放置在内部将允许在内核解压缩映像后回收内存,并将其放置在 __init 部分之外工作,但启动后该内存将永远丢失。我对 Linux 知之甚少,无法知道其中任何一个是否真实/准确,而且我不知道“__init”在哪里

我还尝试了原始位置(适用于 16MiB 图像)并创建了 16MiB + 1K 大小的图像,但这也不起作用。(显然,检查它是否没有覆盖任何过度图像)。

这最初让我认为某处潜伏着 16MiB 的 initramfs 大小限制。但是在搜索它时,它让我觉得这没有意义——据我所知,u-boot 中的 bootm 命令应该为系统设置标签列表(包括 initramfs 的位置和大小),到目前为止,我还没有遇到任何关于与 initramfs 的标记列表相关的 16MiB 限制的说明。

我发现一个页面声称 initramfs 大小实际上限制为系统中物理内存大小的大约一半,而 PicoZed 板有 1G RAM,所以我们距离“应该”的大小相差几个数量级成为一个限制。

澄清一下:16MiB 图像是原始图像的大小;压缩后不到 6MiB。但是,如果我填充它以便它没有被压缩得那么紧,它不会有任何区别 - 问题似乎与压缩图像的大小无关,仅与未压缩图像有关。

主要问题:

  • 这个明显的 16MiB initramfs 大小限制来自哪里?

附带问题:

  • 是否存在诸如“内核 __init 部分”之类的东西,它在内核具有未压缩/加载的图像后被内核回收?如果是这样,我如何查看/配置它的位置/大小?
4

2 回答 2

3

ARM上initramfs的大小限制?

正如你所说,我没有遇到 16 MiB 大小的限制。
有一次我认为也有大小限制,但结果证明这是启动过程中的内存占用问题。一旦解决了这个问题,我就一直在使用 30MiB 的大型 initramfs(例如,使用 glibc、gtstreamer 和 qt5 库)。

这个明显的 16MiB initramfs 大小限制来自哪里?

没有一个。ramfs 仅受可用 RAM 的限制。
“默认 RAM 磁盘大小”有一个定义,但这不会影响 initramfs 的大小。


您使用 U-Boot bootm命令引导的方法值得怀疑,即您将 initramfs 的内存地址作为第二个参数传递。U-Boot 文档清楚地将第二个参数描述为
initrd 映像的地址添加了重点)。 没有提到 initramfs 作为参数。

Linux内核文档指出 initramfs 存档可以“链接到 linux 内核映像”。有一个内核 menuconfig 条目用于指定 initramfs cpio文件的路径。make脚本会将此cpio文件附加到内核映像中,以便有一个用于引导的映像文件。

或者(像 initrd 一样)“一个单独的文件”可以在引导时传递给内核以填充 initramfs。
U-Boot 将此存档的位置(和长度)作为 ATAG 条目或作为设备树 blob 中的保留内存区域传递。
内核需要一个用于 initramfs的cpio存档或一个用于 initrd 的tar存档。

您忽略了(除了压缩之外)这个“initramfs”“单独文件”实际上是什么类型的存档。
因此,不清楚您是使用initrd(tar 存档)还是initramfs(cpio 存档)引导内核。

您将 initramfs 作为“图像”文件而不是 cpio 存档的重复引用表明您确实在使用 initrd。
initrd 肯定会有大小限制。


是否存在诸如“内核 __init 部分”之类的东西,它在内核具有未压缩/加载的图像后被内核回收?

是的,内存中有一段__init,在内核初始化完成后释放。

如果是这样,我如何查看/配置它的位置/大小?

通常初始化后没有用的例程和数据可以用__init宏来声明。看到这个
此内存部分的位置和大小将受链接描述文件的控制,而不是明确的用户控制。内核 System.map 文件应该有供审查的信息。

于 2016-04-04T02:11:56.973 回答
0

我认为您需要在 uboot bootargs 命令中传递ramdisk_size

如果 ram-disk 解压缩文件大小大于默认设置,则需要设置 ramdisk_size。它应该大于 ramdisk 解压缩文件的大小。

于 2016-04-04T06:49:11.587 回答