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