ARM上的initramf的大小限制? [英] Size constraints of initramfs on ARM?

查看:0
本文介绍了ARM上的initramf的大小限制?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在PicoZed板(ARM Cortex A9核)上创建一个可引导的Linux系统,我遇到了一个"限制",我不认为这是一个真正的限制(我感觉这是另一个伪装成限制的问题)。

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

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

所有这些都可以工作,并且我设法启动了Linux+Userland。但是,我需要增加initramf,这就是我遇到问题的地方。

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

在搜索了一些提示后,我在一个论坛上看到有人说图像需要以16MiB的对齐方式放置(我认为这不是真的,但我还是尝试了一下,但它没有得到一个工作正常的系统)。另一篇帖子声称,图片必须与它们的大小对齐(我也不认为这是真的,但我也试过了,但没有改变)。还有一篇帖子声称,如果initramfs镜像跨越__init结束边界,就会发生这种情况,将initramfs镜像牢固地放在里面将允许在镜像被内核解压缩后回收内存,而将其放在__init段之外将起作用,但启动后内存将永远丢失。我对Linux知之甚少,不知道这是否属实/准确,我也不知道"__init"的--如果存在这样的东西--的结束边界在哪里,但如果问题是我跨越了它,我试着将initramf镜像移到我以前使用的任何地方,但这并没有改变任何事情。

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

这最初让我认为在某个地方潜伏着16MiB的initramf大小限制。但在搜索它的过程中,它让我想这是没有意义的--就我所能收集到的u-boot中的bootm命令而言,应该为系统设置标记列表(其中包括initramf的位置和大小),到目前为止,我还没有发现与initramf的标记列表相关的16MiB限制。

我找到一个页面,该页面声称initramf大小实际上被限制为系统中物理RAM大小的大约一半,而PicoZed板具有1G RAM,因此我们偏离了应该是一个限制的数量级。

要澄清的是:16MiB图像是原始图像的大小;压缩后的图像略低于6MiB。但是,如果我填充它,使其压缩得不那么紧密,则没有任何区别--问题似乎与压缩图像的大小无关,而只与未压缩图像有关。

主要问题:

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

附带问题:

  • 有没有内核在解压/加载镜像后回收的内核__init段?如果是,我如何查看/配置其位置/大小?

推荐答案

ARM上initramf的大小限制?

我没有遇到您声称的16 MiB大小限制。
我一度也认为有大小限制,但结果发现这是启动时的内存占用问题。一旦解决了这个问题,我就一直在使用30MiB的大型initramf(例如,使用glibc、gtStreamer和qt5库)。

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

没有。随机文件系统仅受可用内存的限制。
"默认RAM磁盘大小"有一个定义,但这不会影响initramf的大小。


您使用U-Bootbootm命令启动的方法可疑,即您将initramf的内存地址作为第二个参数传递。
U-Boot documentation将第二个参数清楚地描述为"initrd映像的地址"(已添加强调)。
没有提到将initramf作为参数。

Linuxkernel documentation声明initramfs存档可以"链接到Linux内核映像"。有一个内核menuconfig条目,用于指定initramfscpio文件的路径。make脚本会将此cpio文件附加到内核映像,以便只有一个映像文件用于引导。

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

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

您反复将initramf引用为"图像"文件,而不是cpio归档文件,这表明您确实在使用initrd。
Initrd肯定会有大小限制。


是否存在内核在解压缩/加载镜像后回收的"core__init段"?

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

如果是,我如何查看/配置其位置/大小?

通常可以使用__init宏来声明初始化后不再使用的例程和数据。请参阅this
此内存段的位置和大小将由链接器脚本控制,而不是显式的用户控制。内核System.map文件应该包含要查看的信息。

这篇关于ARM上的initramf的大小限制?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆