2014년 8월 9일 토요일

[Linux Kernel] 65주차(2014.08.09)

ARM Linux Kernel 65주차 후기

일시 : 2014.08.09 (65주차)
모임명 : NAVER개발자커뮤니티지원_IAMROOT.ORG_10차ARM-C
장소 : 토즈 타워점
장소지원 : NAVER 개발자 커뮤니티 지원 프로그램
참여인원 : 5명

스터디 진도 :

  • mm_init() 분석을 끝냈습니다.
  • start_kernel()-> mm_init()-> kmem_cache_init() 완료
  • start_kernel()-> mm_init()-> percpu_init_late() 완료
  • start_kernel()-> mm_init()-> pgtable_cache_init() 완료
  • start_kernel()-> mm_init()-> vmalloc_init() 완료
  • 다음주 8월 16일에 66주차는 mm_init()을 복습합니다.

main.c::start_kernel()

asmlinkage void __init start_kernel(void)
{
...
    boot_cpu_init();
    // 현재 cpu(core id)를 얻어서 cpu_XXX_bits[] 의 cpu를 셋한다.

    page_address_init();
    // 128개의 page_address_htable 배열을 초기화
...
    setup_arch(&command_line);
...
    setup_nr_cpu_ids();
    setup_per_cpu_areas();
    // pcpu 구조체를 만들어 줌 (mm/percpu.c)

    smp_prepare_boot_cpu();    /* arch-specific boot-cpu hooks */
    // boot cpu 0의 pcpu 영역의 base주소를 core register에 설정해줌
...
    page_alloc_init();
    // cpu_chain에 page_alloc_cpu_notify를 연결함 (mutex lock/unlock 사용)
...
    vfs_caches_init_early();
    // Dentry cache, Inode-cache용 hash를 위한 메모리 공간을 각각 512kB, 256kB만큼 할당 받고,
    // 131072, 65536개 만큼 hash table을 각각 만듬
...
    mm_init();
    // buddy와 slab 을 활성화 하고 기존 할당 받은 bootmem 은 buddy,
    // pcpu 메모리, vmlist 는 slab으로 이관

// 2014/08/09 종료

main.c::mm_init()

static void __init mm_init(void)
{
    page_cgroup_init_flatmem(); // null function
    mem_init();
    // bootmem으로 관리하던 메모리를 buddy로 이관.
    // 각 section 메모리 크기를 출력.

    // mm/Makefile 에서 CONFIG_SLUB 설정으로 slub.c 로 jump
    kmem_cache_init();
    // slub 을 활성화 시킴

    percpu_init_late();
    // dchunk로 할당 받은 pcpu 메모리 값들을 slab으로 카피하여 이관

    pgtable_cache_init(); // null function

    vmalloc_init();
    // vmlist에 등록된 vm struct 들을 slab으로 이관하고 RB Tree로 구성
}

vmalloc.c::vmalloc_init()

void __init vmalloc_init(void)
{
    struct vmap_area *va;
    struct vm_struct *tmp;
    int i;

    for_each_possible_cpu(i) {
    // for ((i) = -1; (i) = cpumask_next((i), (cpu_possible_mask)), (i) < nr_cpu_ids; )

        struct vmap_block_queue *vbq;
        struct vfree_deferred *p;

        // i: 0, per_cpu(vmap_block_queue, 0): *(&vmap_block_queue + __per_cpu_offset[0])
        vbq = &per_cpu(vmap_block_queue, i);
        // vbq: &vmap_block_queue + __per_cpu_offset[0]

        // &vbq->lock: &(&vmap_block_queue + __per_cpu_offset[0])->lock
        spin_lock_init(&vbq->lock);
        // &(&vmap_block_queue + __per_cpu_offset[0])->lock 을 이용한 spinlock 초기화

        // &vbq->free: &(&vmap_block_queue + __per_cpu_offset[0])->free
        INIT_LIST_HEAD(&vbq->free);
        // &vbq->free: &(&vmap_block_queue + __per_cpu_offset[0])->free 리스트 초기화

        // i: 0, per_cpu(vfree_deferred, 0): *(&vfree_deferred + __per_cpu_offset[0])
        p = &per_cpu(vfree_deferred, i);
        // p: &vfree_deferred + __per_cpu_offset[0]

        // p->list: (&vfree_deferred + __per_cpu_offset[0])->list
        init_llist_head(&p->list);
        // llist의 first를 NULL로 초기화

        // p->wq: (&vfree_deferred + __per_cpu_offset[0])->wq
        INIT_WORK(&p->wq, free_work);
        // wq의 member를 초기화

        // [loop 2 .. 3] 수행은 skip
    }

    /* Import existing vmlist entries. */

    // ioremap.c 에서 static_vmlist 로 이전에 추가해 놓은 vm 정보들
    // SYSC: 0xf6100000 +  64kB   PA:0x10050000
    // TMR : 0xf6300000 +  16kB   PA:0x12DD0000
    // WDT : 0xf6400000 +   4kB   PA:0x101D0000
    // CHID: 0xf8000000 +   4kB   PA:0x10000000
    // CMU : 0xf8100000 + 144kB   PA:0x10010000
    // PMU : 0xf8180000 +  64kB   PA:0x10040000
    // SRAM: 0xf8400000 +   4kB   PA:0x02020000
    // ROMC: 0xf84c0000 +   4kB   PA:0x12250000
    for (tmp = vmlist; tmp; tmp = tmp->next) {
        // tmp: SYSC

        // sizeof(struct vmap_area): 52 bytes, GFP_NOWAIT: 0
        // kzalloc(52, 0): kmem_cache#2-o10
        va = kzalloc(sizeof(struct vmap_area), GFP_NOWAIT);
        // va: kmem_cache#2-o10

        // va->flags: (kmem_cache#2-o10)->flags, VM_VM_AREA: 0x04
        va->flags = VM_VM_AREA;
        // va->flags: (kmem_cache#2-o10)->flags: 0x04

        // va->va_start: (kmem_cache#2-o10)->va_start, tmp->addr: 0xf6100000
        va->va_start = (unsigned long)tmp->addr;
        // va->va_start: (kmem_cache#2-o10)->va_start: 0xf6100000

        // va->va_end: (kmem_cache#2-o10)->va_end
        // va->va_start: (kmem_cache#2-o10)->va_start: 0xf6100000, tmp->size: 0x10000
        va->va_end = va->va_start + tmp->size;
        // va->va_end: kmem_cache#2-o10)->va_end: 0xf6110000

        // va->vm: (kmem_cache#2-o10)->vm, tmp: SYSC
        va->vm = tmp;
        // va->vm: (kmem_cache#2-o10)->vm: SYSC

        // va: kmem_cache#2-o10
        __insert_vmap_area(va);
        // vm SYSC 정보를 RB Tree 구조로 삽입

        // tmp가 TMR WDT CHID CMU PMU SRAM ROMC
        // 순서로 루프 수행
    }

    // VMALLOC_END: 0xff000000UL
    vmap_area_pcpu_hole = VMALLOC_END;
    // vmap_area_pcpu_hole: 0xff000000UL

    // vmap_initialized: false
    vmap_initialized = true;
    // vmap_initialized: true
}

study log

Updating 3c613fb..7c610e9
Fast-forward
arch/arm/include/asm/atomic.h     |  1 +
arch/arm/include/asm/pgtable.h    |  2 ++
arch/arm/mm/ioremap.c             |  8 ++---
include/asm-generic/atomic-long.h |  2 ++
include/linux/gfp.h               |  1 +
include/linux/list.h              |  1 +
include/linux/llist.h             |  1 +
include/linux/rbtree.h            | 13 ++++++++
include/linux/slab.h              | 24 +++++++++++++++
include/linux/spinlock.h          |  1 +
include/linux/types.h             |  4 ++-
include/linux/vmalloc.h           |  2 ++
include/linux/workqueue.h         | 30 +++++++++++++++++--
init/main.c                       |  7 +++++
lib/rbtree.c                      |  6 ++++
mm/slub.c                         | 12 ++++++++
mm/vmalloc.c                      | 62 ++++++++++++++++++++++++++++++++++++++-
17 files changed, 168 insertions(+), 9 deletions(-)

댓글 없음:

댓글 쓰기