在旧initrd
系统下,Linux 习惯于释放镜像initrd
。这是在控制台上跟踪的:
Freeing initrd memory: xxxxk freed.
这里所说的实际上是释放原压缩图像所占用的内存。活动的、已挂载的文件系统是通过卸载(通过pivot_root
替换根)释放的。
在 下initramfs
,文件系统是通过使用某些实用程序(例如 和 )进行递归删除来释放的switch_root
,并且永远不会卸载。我明白了,但是原始图像(压缩.cpio
档案)在哪里释放?
我正在查看init/initramfs.c (populate_rootfs)
并发现实际上initramfs
可以从 或 中解包数据__initramfs_start
,initrd_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
。