我在PicoZed主板上创建了一个可启动的Linux系统(ARM CortexA9内核),并且我遇到了一个限制因素,我真的不这么认为是一种限制(我觉得这是另一个伪装成限制的问题)。
我在JTAG启动模式下启动系统启动;在电路板上电之后,我使用xmd调试器将u-boot放入系统的RAM中,然后运行它。
接下来,我将内核(uImage),gzip" initramfs映像和设备树放入内存。最后,我告诉u-boot使用bootm引导系统,并使用三个参数指出所有图像的内存位置。
所有这些都有效,我设法启动Linux + userland。但是,我需要增加initramfs,这就是我遇到问题的地方。
工作图像完全是16MiB。我尝试将其设置为24MiB(每次尝试启动时都从头开始完全重新生成),但是在内核加载并尝试查找init后,内核报告文件系统故障并失败。不应该有任何重叠,但万一我尝试移动一些东西,但同样的问题发生。
在搜索了一些提示之后,我看到论坛上有人说图像需要放在16MiB对齐位置(我不认为这是真的,但我尝试了它,但它没有& #39;得到一个工作系统)。另一篇文章声称图像必须与它们的尺寸一致(我再也不认为是真的,但我也试过了,但没有改变)。还有一篇文章称,如果initramfs图像穿过__init端边界,并且将initramfs图像牢牢地放在里面,则会在内核解压缩图像后将内存回收,并将其置于__init部分之外,这样就会发生这种情况。工作但是那个记忆在启动后永远丢失了。我对Linux知之甚少,以了解其中任何一个是否真实/准确,我不知道在哪里" __ init" - 如果存在这样的事情 - 结束-boundary是,但如果问题是我正在越过它,我尝试将initramfs图像移动到我之前使用它的任何地方,但这并没有改变任何东西。
我还尝试了原始位置(使用16MiB图像)并创建了16MiB + 1K大小的图像,但这也没有用。 (显然,检查它是否覆盖了任何过度图像)。
这最初促使我认为潜伏在某处的16MiB initramfs大小限制。但是在搜索它时,它让我觉得没有意义 - 只要我可以在u-boot中收集bootm命令,就可以设置系统的标签列表(包括位置和大小) initramfs),到目前为止,我还没有看到关于initramfs的标记列表的16MiB限制的任何注释。
我发现一个页面声称initramfs的大小实际上限制在系统中物理ram大小的一半左右,PicoZed板有1G RAM,所以我们只需要几个数量级从什么"应该"是一种限制。
澄清:16MiB图像是原始图像的大小;将它压缩到6MiB以下。但是,如果我填充它以使它没有紧密压缩它没有任何区别 - 问题似乎与压缩图像的大小无关,只有未压缩的图像
主要问题:
侧面的问题:
答案 0 :(得分:3)
ARM上initramfs的大小限制?
我声称你没有遇到16 MiB大小的限制 曾经有一段时间我认为还有一个大小限制,但结果却是引导期间的内存占用问题。一旦完成整理,我一直在使用30MiB的大型initramfs(例如使用glibc,gtstreamer和qt5库)。
这个明显的16MiB initramfs大小限制来自哪里?
没有一个。 ramfs仅受可用RAM的限制 “默认RAM磁盘大小”有一个定义,但这不会影响initramfs的大小。
使用U-Boot bootm 命令启动的方法是可疑的,即您将initramfs的内存地址作为第二个参数传递。
U-Boot documentation清楚地将第二个参数描述为“ initrd 图像的地址”(强调添加)。
没有提到initramfs作为参数。
Linux kernel documentation声明initramfs存档可以“链接到linux内核映像”。有一个内核menuconfig条目,用于指定initramfs cpio 文件的路径。 make 脚本会将此 cpio 文件附加到内核映像,以便有一个用于启动的映像文件。
或者(像initrd一样)“一个单独的文件”可以在启动时传递给内核以填充initramfs。
U-Boot将此存档的位置(和长度)作为ATAG条目或设备树blob中的保留内存区域传递。
内核需要initramfs的 cpio 存档或initrd的 tar 存档。
您忽略了(除了压缩之外)“initramfs”或“单独文件”实际上是什么类型的存档。
因此,目前尚不清楚您是使用 initrd (tar存档)还是 initramfs (cpio存档)启动内核。
您重复引用initramfs作为“ image ”文件而不是cpio存档表明您确实在使用initrd。
initrd肯定会有一个大小约束。
是否存在“内核__init节”这样的东西,它在内核被解压缩/加载后被内核回收?
是的,有一个__init内存部分,在内核初始化完成后释放。
如果是这样,我如何查看/配置它的位置/大小?
通常可以使用__init
宏声明初始化后无用的例程和数据。见this。
此内存部分的位置和大小将受链接器脚本的控制,而不是显式用户控制。内核System.map文件应具有要查看的信息。
答案 1 :(得分:0)
我认为您需要在uboot bootargs命令中传递 ramdisk_size
如果ram-disk解压缩文件,则需要设置