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