Skip to content

Latest commit

 

History

History
111 lines (95 loc) · 3.8 KB

a10c_63.md

File metadata and controls

111 lines (95 loc) · 3.8 KB

ARM10C 63주차 후기

일시 : 2014.07.19 (63주차)
모임명 : NAVER개발자커뮤니티지원_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
}

nod 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(-)