2014년 4월 2일 수요일

[Linux Kernel] 48주차(2014.03.29) 후기

10차 ARM 리눅스 커널 스터디 48주차(2014.03.29) 후기입니다. 

# 일시 : 2014.03.29 (48주차)
# 모임명 : NAVER개발자커뮤니티지원_IAMROOT.ORG_10차ARM-C
# 장소 : 토즈 타워점
# 장소지원 : NAVER 개발자 커뮤니티 지원 프로그램
# 참여인원 : 5명
# 스터디 진도 : 
 - start_kernel()-> sort_main_extable();
 - start_kernel()-> trap_init();
 - start_kernel()-> mm_init();

# sort_main_extable();
extable을 cmp_ex 함수를 이용해서 sort를 하는 과정입니다. 

## 전역 변수 main_extable_sort_needed 에 따라서 소팅 여부를 결점합니다. 
 main_extable_sort_needed 는 초기화되어 1로 설정되어 있습니다. 
이 값은 커널을 구성할 때 extable을 초기화 했다면 초기화됩니다. 
u32 __initdata main_extable_sort_needed = 1; 

## 부트 메시지 출력
"Sorting __ex_table...\n"

## exception 구조체 엔트리 
 exception_table_entry는 instruction과 예외처리로 구성됩니다.  

<code>
 38struct exception_table_entry                                                 
 39{                                                                            
 40        unsigned long insn, fixup;                                           
 41};
</code>

## 정렬(sort)함수
이 구조체 엔트리를 처음 (start)부터 끝 (finish)까지 정렬하며
정렬의 비교는 cmp_ex함수에 따릅니다. 
cmp_ex함수는 insn의 값을 비교하여 값을 리턴합니다. 

## extable은 어떤 값들이 들어갈까?
- arch/arm/nwfpe/entry.S
  .pushsection __ex_table,"a"
  .align3
  .long.Lx1, .Lfix

- arch/arm/mm/alignment.c
  #define __get8_unaligned_check(ins,val,addr,err)\
  __asm__(                                        \
  ARM("1:"ins"%1, [%2], #1\n")                    \

- arch/arm/lib/putuser.S
   .pushsection __ex_table, "a"
   .long1b, __put_user_bad
   .long2b, __put_user_bad
- arch/arm/lib/backtrace.S
  .pushsection __ex_table,"a"
  .align3
  .long1001b, 1006b

- arch/arm/kernel/swp_emulate.c
  #define __user_swpX_asm(data, addr, res, temp, B)\
          __asm__ __volatile__(                    \
          "mov%2, %1\n"                            \

- arch/arm/kernel/entry-armv.S
  .pushsection __ex_table,"a"
  .long1b, 4b
  #if CONFIG_ARM_THUMB && __LINUX_ARM_ARCH__ >= 6 && CONFIG_CPU_V7

- arch/arm/include/asm/word-at-a-time.h
   static inline unsigned long load_unaligned_zeropad(const void *addr)
  {
  unsigned long ret, offset;
  }

- arch/arm/include/asm/uaccess.h
  #define __get_user_asm_byte(x,addr,err)\
  __asm__ __volatile__(                  \
  "1:" TUSER(ldrb) "%1,[%2],#0\n"        \

- arch/arm/include/asm/futex.h
  #define __futex_atomic_ex_table(err_reg)\
  "3:\n"\
  ".pushsection __ex_table,\"a\"\n"\

- arch/arm/include/asm/assembler.h
  #define USER(x...)          \
  9999:x;                     \
  .pushsection __ex_table,"a";\

# trap_init();
 null 함수 입니다. 

# mm_init();
 커널 메모리 할당자를 설정합니다. 
스터디 초기에 이야기 되었던 커널을 메모리 할당자를 설정하는 과정입니다. 
기억을 더듬어 보면 리눅스 커널을 메모리 할당자로 버디 시스템과 슬렙을 
사용한다고 하였습니다. 

## mm_init 함수
<code>
 504static void __init mm_init(void)
 505{                                                                           
 506        /*                                                                  
 507         * page_cgroup requires contiguous pages,                           
 508         * bigger than MAX_ORDER unless SPARSEMEM.                          
 509         */                                                                 
 510        page_cgroup_init_flatmem(); 
 511        mem_init();                                                         
 512        kmem_cache_init();                                                  
 513        percpu_init_late();                                                 
 514        pgtable_cache_init();                                               
 515        vmalloc_init();                                                     
 516} 
</code>

## mm_init의 내부 함수 분석
- page_cgroup_init_flatmem();
 // null 함수 입니다. 
- mem_init() 
 // 하는일이 많네요. 나누어서 분석을 해야 겠네요. 

# mem_init()

<code>
707void __init mem_init(void)
708{ 
717        max_mapnr   = pfn_to_page(max_pfn + PHYS_PFN_OFFSET) - mem_map;      
721        free_unused_memmap(&meminfo);                                        
724        free_all_bootmem();  
...
</code>

## max_mapnr = pfn_to_page(max_pfn + PHYS_PFN_OFFSET) - mem_map;
 - pfn_to_page(0xA0000)
   - max_pfn : 0x80000
   - PHYS_PFN_OFFSET: 0x20000
 - *mem_map: NULL
 max_mapnr : page 10번째 section 주소 + 0xA0000

## free_unused_memmap(&meminfo);
 bank 0, 1이 align이 안 되었다면 free_memmap을 실행
## free_all_bootmem();
분석이 다 끝나지 않았기 때문에 , 다음 스터디 시간에 계속 코드 분석을
하고 난 이후에 내용을 정리할 것입니다.  

# 스터디 로그
2373f37..5eef279  master     -> origin/master
Updating 2373f37..5eef279
Fast-forward
 Reference/gnu-arm-assy-quick-ref.pdf | Bin 0 -> 111341 bytes
 arch/arm/include/asm/atomic.h        |  13 +++++++
 arch/arm/include/asm/memory.h        |   3 ++
 arch/arm/include/asm/processor.h     |  13 ++++++-
 arch/arm/include/asm/setup.h         |   5 +++
 arch/arm/kernel/traps.c              |   1 +
 arch/arm/kernel/vmlinux.lds.S        |  10 +++--
 arch/arm/lib/backtrace.S             |   2 +-
 arch/arm/lib/getuser.S               |   2 +-
 arch/arm/lib/putuser.S               |   2 +-
 arch/arm/mm/init.c                   |  35 +++++++++++++++--
 arch/arm/nwfpe/entry.S               |   2 +-
 include/asm-generic/memory_model.h   |  12 ++++++
 include/linux/kmemcheck.h            |   3 +-
 include/linux/list.h                 |   2 +
 include/linux/mm.h                   |  13 +++++++
 include/linux/mm_types.h             |   4 +-
 include/linux/mmzone.h               |  18 ++++++++-
 include/linux/nodemask.h             |   3 ++
 include/linux/numa.h                 |   1 +
 include/linux/page-flags.h           |   5 +++
 include/linux/page_cgroup.h          |   3 +-
 include/linux/tracepoint.h           |  15 ++++++++
 include/linux/types.h                |   1 +
 include/trace/events/kmem.h          |  23 +++++++++++
 include/trace/ftrace.h               |   3 ++
 init/main.c                          |   8 +++-
 kernel/extable.c                     |   2 +-
 lib/extable.c                        |   1 +
 mm/bootmem.c                         |  56 +++++++++++++++++++++++++++
 mm/internal.h                        |  10 +++++
 mm/memory.c                          |   4 +-
 mm/mmzone.c                          |  11 ++++++
 mm/page_alloc.c                      |  72 ++++++++++++++++++++++++++++++++++-
 34 files changed, 337 insertions(+), 21 deletions(-)
 create mode 100644 Reference/gnu-arm-assy-quick-ref.pdf

댓글 없음:

댓글 쓰기