이전 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
.