2014년 7월 19일 토요일

[Linux Kernel] 63주차(2014.07.19)

ARM10C 63주차 후기

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

스터디 진도 :

  • mm_init()을 계속 분석합니다.
  • start_kernel()-> mm_init()->kmem_cache_init()->bootstrap()분석중
  • bootstrap()은 두번 실행됩니다.
  • 1번째는 &boot_kmem_cache 매개변수를 가지고
  • /지난번 분석이 잘못되었습니다./
  • 2번째도 &boot_kmem_cache를 가지고 실행합니다.
  • 따라서 bootstrap()를 다시 분석합니다.

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();
// mm/Makefile 에서 CONFIG_SLUB 설정으로 slub.c 로 jump
kmem_cache_init();

slub.c::kmem_cache_init()

void __init kmem_cache_init(void)
{
    static __initdata struct kmem_cache boot_kmem_cache,
        boot_kmem_cache_node;

    kmem_cache_node = &boot_kmem_cache_node;
    kmem_cache = &boot_kmem_cache;    

    create_boot_cache(kmem_cache_node, "kmem_cache_node",
        sizeof(struct kmem_cache_node), SLAB_HWCACHE_ALIGN);

    /* Able to allocate the per node structures */
    slab_state = PARTIAL;
    // slab_state 의미:
    // slab을 초기화한 단계를 나타냄, PARTIAL은 kmem_cache_node 만 사용이 가능함

    create_boot_cache(kmem_cache, "kmem_cache",
            offsetof(struct kmem_cache, node) +
                nr_node_ids * sizeof(struct kmem_cache_node *),
               SLAB_HWCACHE_ALIGN);

    kmem_cache = bootstrap(&boot_kmem_cache);

    kmem_cache_node = bootstrap(&boot_kmem_cache_node);
kmem_cache_node = bootstrap(&boot_kmem_cache_study);

slub.c::bootstrap()

// ARM10C 20140705
// &boot_kmem_cache_node
static struct kmem_cache * __init bootstrap(struct kmem_cache *static_cache)
{
    int node;

    struct kmem_cache *s = kmem_cache_zalloc(kmem_cache, GFP_NOWAIT);
  • kmem_cache: &boot_kmem_cache
  • 지난 주는 이것을 &boot_kmem_cache가 아닌 &boot_kmem_cache_node로 잘못 분석했다.
  • 따라서 이번주는 이것을 올바르게 수정해서 다시 분석을 한다.
  • GFP_NOWAIT: 0
  • 따라서 kmem_cache_zalloc()는 매개변수 (kmem_cache, GFP_NOWAIT)로 호출된다.

slab.h::kmem_cache_zalloc()

// ARM10C 20140719 // kmem_cache: UNMOVABLE인 page (boot_kmem_cache)의 object의 시작 virtual address, GFP_NOWAIT: 0
static inline void *kmem_cache_zalloc(struct kmem_cache *k, gfp_t flags)
{
    // k: UNMOVABLE인 page (boot_kmem_cache)의 object의 시작 virtual address, flags: GFP_NOWAIT: 0, __GFP_ZERO: 0x8000u
    // kmem_cache_alloc(UNMOVABLE인 page (boot_kmem_cache)의 object의 시작 virtual address, __GFP_ZERO: 0x8000u):
    // UNMOVABLE인 page (boot_kmem_cache)의 시작 virtual address + 128
    return kmem_cache_alloc(k, flags | __GFP_ZERO);
    // return UNMOVABLE인 page (boot_kmem_cache)의 시작 virtual address + 128
}

study log

boot_kmem_cache를 가지고 bootstrap()을 다시 분석했습니다.
cd7d188..cc0ab55  master     -> origin/master
Updating cd7d188..cc0ab55
Fast-forward
arch/arm/include/asm/processor.h |    2 -
include/linux/fault-inject.h     |    1 +
include/linux/gfp.h              |    1 +
include/linux/kernel.h           |    4 +-
include/linux/memcontrol.h       |   10 +-
include/linux/percpu.h           |   98 ---
include/linux/slab.h             |   23 +-
include/linux/slub_def.h         |    1 +
include/linux/topology.h         |    1 +
mm/slab_common.c                 |   43 ++
mm/slub.c                        | 1369 +++++++++++++++++++++++++++-----------
11 files changed, 1041 insertions(+), 512 deletions(-)

댓글 없음:

댓글 쓰기