将“.init.ramfs”映像解压到“rootfs”后,什么会释放该映像?

将“.init.ramfs”映像解压到“rootfs”后,什么会释放该映像?

在旧initrd系统下,Linux 习惯于释放镜像initrd。这是在控制台上跟踪的:

 Freeing initrd memory: xxxxk freed.

这里所说的实际上是释放原压缩图像所占用的内存。活动的、已挂载的文件系统是通过卸载(通过pivot_root替换根)释放的。

在 下initramfs,文件系统是通过使用某些实用程序(例如 和 )进行递归删除来释放的switch_root,并且永远不会卸载。我明白了,但是原始图像(压缩.cpio档案)在哪里释放?

我正在查看init/initramfs.c (populate_rootfs)并发现实际上initramfs可以从 或 中解包数据__initramfs_startinitrd_start甚至可以从两者中解包数据!该initrd区域由 释放free_initrd(),但这里没有逻辑对从 开始的内存进行类似的释放__initramfs_start

有人可以阐明如何释放这段内存吗?或者确认它没有被释放?它是否位于与其他未使用的内存一起被丢弃的部分中?

我添加了一些诊断,显示它__initramfs_start位于已释放的未使用内存之外。这是在 ARM 嵌入式系统上:

[    1.241857] Freeing unused kernel memory: 3240K [c0c01000, c0f2b000)
[    1.241874] Initramfs image starts at: e7fddef0

但是,如果我查看链接器脚本,我会发现INITRAMFS 放置在__init_start__init_end符号之间,所以这种差异可能是由于某些运行时重定位造成的?大小大致正确:原始压缩图像为 2958550 字节,这可以合理地占所报告的 3240K 的大部分。

答案1

好吧,我已经通过以下实验确认了内存被释放。我在 中添加了几兆字节的随机垃圾initramfs,构建了内核并启动。报告Freeing unused kernel memory的大小增加了大约该垃圾的大小。此外,这种膨胀对通过free和启动后看到的可用内存没有影响/proc/meminfo

相关内容