본문 바로가기

리눅스 커널의 구조와 원리/14. 메모리 관리

[Linux] mm: memory layout

memory layout is traced at boot in the previous kernel version where the current 
version cannot show the memory map. 

https://elixir.bootlin.com/linux/v4.14.30/source/arch/arm64/mm/init.c#L583
void __init mem_init(void)
{
if (swiotlb_force == SWIOTLB_FORCE ||
    max_pfn > (arm64_dma_phys_limit >> PAGE_SHIFT))
swiotlb_init(1);
else
swiotlb_force = SWIOTLB_NO_FORCE;

set_max_mapnr(pfn_to_page(max_pfn) - mem_map);

#ifndef CONFIG_SPARSEMEM_VMEMMAP
free_unused_memmap();
#endif
/* this will put all unused low memory onto the freelists */
free_all_bootmem();

kexec_reserve_crashkres_pages();

mem_init_print_info(NULL);

#define MLK(b, t) b, t, ((t) - (b)) >> 10
#define MLM(b, t) b, t, ((t) - (b)) >> 20
#define MLG(b, t) b, t, ((t) - (b)) >> 30
#define MLK_ROUNDUP(b, t) b, t, DIV_ROUND_UP(((t) - (b)), SZ_1K)

pr_notice("Virtual kernel memory layout:\n");
#ifdef CONFIG_KASAN
pr_notice("    kasan   : 0x%16lx - 0x%16lx   (%6ld GB)\n",
MLG(KASAN_SHADOW_START, KASAN_SHADOW_END));
#endif
pr_notice("    modules : 0x%16lx - 0x%16lx   (%6ld MB)\n",
MLM(MODULES_VADDR, MODULES_END));
pr_notice("    vmalloc : 0x%16lx - 0x%16lx   (%6ld GB)\n",
MLG(VMALLOC_START, VMALLOC_END));
pr_notice("      .text : 0x%p" " - 0x%p" "   (%6ld KB)\n",
MLK_ROUNDUP(_text, _etext));
pr_notice("    .rodata : 0x%p" " - 0x%p" "   (%6ld KB)\n",
MLK_ROUNDUP(__start_rodata, __init_begin));
pr_notice("      .init : 0x%p" " - 0x%p" "   (%6ld KB)\n",
MLK_ROUNDUP(__init_begin, __init_end));
pr_notice("      .data : 0x%p" " - 0x%p" "   (%6ld KB)\n",
MLK_ROUNDUP(_sdata, _edata));
pr_notice("       .bss : 0x%p" " - 0x%p" "   (%6ld KB)\n",
MLK_ROUNDUP(__bss_start, __bss_stop));
pr_notice("    fixed   : 0x%16lx - 0x%16lx   (%6ld KB)\n",
MLK(FIXADDR_START, FIXADDR_TOP));
pr_notice("    PCI I/O : 0x%16lx - 0x%16lx   (%6ld MB)\n",
MLM(PCI_IO_START, PCI_IO_END));
#ifdef CONFIG_SPARSEMEM_VMEMMAP
pr_notice("    vmemmap : 0x%16lx - 0x%16lx   (%6ld GB maximum)\n",
MLG(VMEMMAP_START, VMEMMAP_START + VMEMMAP_SIZE));
pr_notice("              0x%16lx - 0x%16lx   (%6ld MB actual)\n",
MLM((unsigned long)phys_to_page(memblock_start_of_DRAM()),
    (unsigned long)virt_to_page(high_memory)));
#endif
pr_notice("    memory  : 0x%16lx - 0x%16lx   (%6ld MB)\n",
MLM(__phys_to_virt(memblock_start_of_DRAM()),
    (unsigned long)high_memory));