ARM的initramfs中的大小限制?

问题描述 投票:1回答:2

我创建一个PicoZed板(ARM CortexA9核心)可启动Linux系统,我已经碰到了“限制”,这我不认为是真正的限制(我得到它的另一个问题伪装成一个感觉局限性)。

我启动通过启动JTAG引导模式系统;在黑板上电后我用XMD调试器的u-boot放入系统的RAM,然后我运行它。

接下来,我把内核(把uImage)时,gzip压缩的initramfs镜像和设备树到内存中。最后,我告诉的U-Boot使用bootm,并用三个参数来指出所有图像的存储位置来启动系统。

所有这一切工作,我设法启动的Linux用户空间+。不过,我需要成长的initramfs的,这是我遇到的问题。

工作形象是16MiB准确。我试图使它24MiB(每次都从头开始我尝试启动完全再生),但只是在内核后,加载并试图找到初始化内核报告文件系统错误和失败。不应该有任何重叠,但以防万一我试着周围一点点感动的事情,但发生同样的问题。

寻找一些技巧后,我看到有人在论坛上说,图像需要被放置在一个16MiB排列(这我不认为是真实的,但我想它没有少,但它并没有得到一个工作系统)。另一篇文章声称,该图像必须与它们的大小保持一致(这我又觉得不是真的,但我试过为好,但没有变化)。然而,另一篇文章称,出现这种情况,如果initramfs镜像跨越__init结束边界​​,并放置initramfs的形象牢牢里面将使图像已经由内核解压缩后要回收的内存,并把它超越了__init部分将工作,但随后该内存开机后永远失去了。我知道得太少关于Linux才能知道是否有任何这是任何方式真/准确,我不知道在哪里“__init”的 - 如果这样的事情存在 - 的最终边界,但如果问题是,我在过它,我试图移动initramfs镜像远远超出了任何地方我以前使用它,但这并没有改变任何东西。

我也尝试了原来的位置(这与16MiB形象工程),并创建一个16MiB + 1K大小的图像,但是这也不能工作。 (检查,它没有任何重叠的图像上,很明显)。

这本来使我觉得有一个16MiB initramfs的大小限制潜伏的地方。但在寻找它,它让我认为是没有意义的 - 只要我能在u-boot的聚集bootm命令768,16建立了系统的标签列表(包括initramfs中的位置和大小),而我还没有碰到过任何音符来约相对于标签列出了initramfs的一个16MiB极限为止。

我发现它声称,initramfs的大小是限于大致在系统的物理内存大小的一半实际上一个页面,而PicoZed板上有1G内存,所以我们在数量级远离什么是“应该”是一个限制。

澄清:该16MiB图像是原始图像的大小;压缩它只是6MiB下。不过,如果我填充它,所以它不是压缩,紧紧它没有任何区别 - 这个问题似乎并不涉及到压缩图像的大小,只有未压缩的图像。

主要问题:

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

侧面的问题:

  • 是否有这样的事,作为一个“内核__init节”,这是它具有无压缩/加载的图像后,由内核回收?如果是这样,我怎么看/配置它的位置/大小?
linux-kernel embedded-linux u-boot rootfs
2个回答
3
投票

ARM的initramfs中的大小限制?

如你声称我还没有遇到一个16 MIB大小限制。 有一段时间,我觉得有一个大小的限制太多,但启动过程中竟然是一个内存占用的问题。一旦被整理出来我一直在使用30MiB大的initramfs(例如用glibc,gtstreamer和QT5库)。

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

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


你用的U-Boot bootm命令引导的方法是犯罪嫌疑人,即您要传递initramfs中的内存地址作为第二个参数。 所述U-Boot documentation清楚地描述了第二个参数为“一个initrd图像的地址”(强调)。 没有的initramfs作为参数的提及。

Linux的kernel documentation指出initramfs的存档可以“链接到Linux内核映像”。有用于指定路径的initramfs的cpio文件内核menuconfig的条目。因此,有用于引导一个图像文件的补充脚本将追加此的cpio文件到内核映像。

或(像一个initrd)“单独的文件”可以传递到内核在启动填充initramfs中。 U型引导通过这个压缩或者作为ATAG条目或者作为设备树团块一个保留存储区域的位置(和长度)。 内核期望无论是对initramfs的cpio归档或一个initrd一个tar归档。

你忘了提及(除了其压缩)什么样的这个“initramfs中的”或“独立文件”的档案实际上是。 所以,如果你用启动一个initrd(tar归档文件)或initramfs的(cpio归档)内核的不明确。

“图像”的文件,而不是一个cpio归档你一再提到的initramfs的建议,你真的使用一个initrd。 一个initrd铁定有大小限制。


是否有这样的事,作为一个“内核__init节”,这是它具有无压缩/加载的图像后,由内核回收?

是的,有记忆的__init部分,后内核初始化完成后,其被释放。

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

通常程序和数据具有初始化后没有用可以与__init宏声明。见this。 该内存部分的位置和大小将链接脚本的控制,而不是明确的用户控制下。内核System.map文件应该有审查的信息。


0
投票

我认为你需要通过RAMDISK_SIZE在UBOOT bootargs命令

RAMDISK_SIZE需要如果RAM盘解压缩文件大小比默认值更大的进行设置。它应该比RAMDISK解压缩文件的大小更多。

© www.soinside.com 2019 - 2024. All rights reserved.