Linux/Kernel Analysis

    NUMA BALANCING

    NUMA BALANCING

    NUMA BALANCING에 대해 정리해보고자 합니다. NUMA BALANCING에 대한 설정은 kernel 분석 시 Configure로 설정할 수 있습니다. 먼저 NUMA에 대해 정리해보고 NUMA BALANCING에 대해 정리하겠습니다. NUMA는 Non-Uniform Memory Access(불균일 기억장치 접근)의 약자입니다. 멀티프로세서 시스템에서 불균일 메모리 접근을 위한 설계 기법으로 개발되었습니다. NUMA 시스템에서 프로세서는 자신과 연결된 메모리를 가지고 있습니다. 프로세서와 메모리가 여러 노드를 구성하여 여러 노드가 모여 시스템을 이루고 있습니다. 노드 내 프로세서는 로컬메모리라하고 다른 노드의 메모리를 리모트 메모리라 합니다. 프로세서는 로컬메모리 뿐만 아니라 리모트메모리에도 접근할..

    zone_size_init

    [분석 기준] kernel version : linux kernel 4.16 architecture : aarch64 (arm64) memblock_init() 에서 zone_sizes_init() 함수를 분석한다. 분석 기준은 CONFIG_NUMA가 설정되어 있다는 가정하에 설정한다. zone_sizes_init() 함수에 전달되는 min, max는 DRAM의 memblock 시작과 끝 주소를 전달한다. 1234567891011121314#ifdef CONFIG_NUMA // IMRT >> yes! static void __init zone_sizes_init(unsigned long min, unsigned long max){ unsigned long max_zone_pfns[MAX_NR_ZONES]..

    메모리 모델 (FLATMEM, DISCONTIGMEM, SPARSEMEM)

    리눅스에서 사용 가능한 메모리 모델은 3가지 입니다. 각 메모리 모델에 대해 간단히 정리하겠습니다.3가지 모델의 차이는 물리 메모리 주소 범위와 어떻게 메모리 맵을 관리하는지에 따라 구별됩니다. 3가지의 모델은 FLATMEM, DISCONTIGMEM, SPARSEMEM 입니다.각 메모리 모델은 리눅스 커널 빌드 시 하나를 선택하여 빌드를 해야합니다. 각 메모리 특징에 대해 정리해 보겠습니다. FLATMEM우리나라 용어로 평면 메모리라고도 불립니다. UMA 시스템에서 많이 사용되며 메모리 주소가 연속되는 특성이 입니다. DISCONTIGMEM, SPARSEMEM과 달리 메모리 주소가 연속되어 있기 때문에 중간에 주소 사이의 홀이 없다는 장점이 있습니다. DISCONTIGMEM분리된 메모리 영역입니다. 분리..

    bootmem_init() 부트 메모리 초기화

    [분석 기준] kernel version : linux kernel 4.16 architecture : aarch64 (arm64) bootmem_init() 함수는 함수네임 그대로 부트 메모리 초기화를 위한 함수입니다. 커널은 ZONE이라는 개념을 도입해 메모리를 관리하게 됩니다. bootmem_init() 함수에서 어떻게 부트 메모리를 초기화 하는지 분석해 보도록 하겠습니다. 123456789101112131415161718192021222324void __init bootmem_init(void){ unsigned long min, max; min = PFN_UP(memblock_start_of_DRAM()); max = PFN_DOWN(memblock_end_of_DRAM()); early_mem..

    void __init paging_init() - 커널 페이지 초기화 하기

    [분석 기준] kernel version : linux kernel 4.16 architecture : aarch64 (arm64) 커널용 페이지 테이블 초기화 하는 함수입니다. 전체적인 내용을 분석 후 각 주요 함수에 대해 아래에 연속적으로 분석해 보도록 하겠습니다. 123456789101112131415161718192021222324252627282930void __init paging_init(void){ phys_addr_t pgd_phys = early_pgtable_alloc(); pgd_t *pgdp = pgd_set_fixmap(pgd_phys); map_kernel(pgdp); map_mem(pgdp); /* * We want to reuse the original swapper_pg_..

    [커널분석] arm64_memblock_init()

    리눅스 커널 분석은 4.16 버전을 기준으로 하였습니다. memblock은 리눅스 커널 부트업 단계에서 사용되는 메모리 할당자입니다. memblock은 메모리를 3가지 타입으로 나누어 관리하고 있는데요, 각각 memory, reserved, physmem 타입입니다. 먼저 memblock 자료구조에 대해 확인해보시죠. memblock은 3개의 type을 위한 memblock_type 구조체를 가지고 있고, 각 타입에는 region이란 영역을 관리하기 위해 memblock_region 구조체 포인터를 가지고 있습니다. memory, reserved 영역은 총 128개의 region을 가질 수 있으며 모두 사용하게 되면 2배로 크기가 늘어나 설정되어 집니다.[include/linux/memblock.h]12..