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(-)
댓글 없음:
댓글 쓰기