각각 Bootstrap loader와 Kernel vmlinux의 head.o(head.S) 두 개의 소스파일은 별개이며 혼돈해서는 안된다.
* Bootloader
- 전원이 처음 인가되면 곧바로 실행되는 시스템의 비휘발성 메모리에 저장되어있는 로우레벨 코드
- 저수준 초기화를 진행하기 위해 간단한 초기화 코드와 부트 이미지를 로드하기 위한 코드 및 시스템 자체 진단 루틴 등을 포함
- 최종적으로 OS 이미지를 로드하고 알맞은 곳에 위치시키고나서 제어권을 해당 이미지로 넘긴다
* Bootstrap loader(kernel/arch/arm/boot/compressed/head.S)
- 커널 이미지의 압축을 해제
- 커널 이미지를 재배치 하기위한 알맞은 환경을 만든다
- 커널로 제어권을 옮긴다
* Kernel vmlinux - kernel/arch/arm/kernel/head.S
- 프로세서와 아키텍처가 올바른지 검사
- 초기 페이지 테이블 생성
- 프로세서의 메모리 관리 장치(MMU)를 활성화
- 예전 기억을 떠올려보면, MMU 활성화 전/후에 TRACE32등의 debugger로 tracing을 하기 위해서는, MMU가 활성화 되기 전에 MMU 활성화 후에 jump될 주소를 미리 계산해서 breakpoint를 설정 해 주어야 함
- 일부 에러감지 및 리포팅을 위한 설정
- 커널 본체의 시작점 main.c로 점프
- MMU의 유/무에 따라서 head-common.S 또는 head-nommu.S에서 start_kernel로 점프할 수도 있다
* Kernel main.o - kernel/init/main.c
- Kernel command line 처리
- Call initializing function directly. ex) init_timers() / console_init()
- *_initcall 매크로를 이용해 초기화 함수들을 ELF 이미지의 특정 section에 등록(do_initcalls에서 호출)
- do_initcalls()에서 *_initcall을 이용해 등록된 초기화 함수들을 호출한다
- 초기화 함수와 데이터에 의해 사용된 메모리 영역을 해제 (init_post() in kernel/init/main.c)
- free_initmem() in kernel/init/main.c
- ex) .init.text / .init.data / .initcalln.init
- 시스템 콘솔장치를 연다 (init_post() in kernel/init/main.c)
- sys_open((const char __user *) "/dev/console", O_RDWR, 0)
- 최초의 사용자 영역 프로세스를 시작 (init_post() in kernel/init/main.c)
- run_init_process는 execve() system call을 이용
- run_init_process(execute_command)
- run_init_process("/sbin/init")
- run_init_process("/etc/init")
- run_init_process("/bin/init");
- run_init_process("/bin/sh");
- execve() system call을 이용하므로 실행에 성공하면 return되지 않는다
- 그러므로 실행에 실패하게 되면, init_post()함수의 마지막에 있는 panic()을 만나 kernel panic이 발생
# cgroup - Control Groups provide a mechanism for aggregating/partitioning sets of tasks, and all their future children, into hierarchical groups with specialized behavior.
'리눅스 & 안드로이드' 카테고리의 다른 글
Kernel Command Line (0) | 2011.02.15 |
---|---|
GNU Compiler __attribute__ (2) | 2011.02.11 |
kernel 빌드에서 생성/링크되는 파일들 (0) | 2011.02.10 |
vmlinux image 구성요소 (0) | 2011.02.10 |
Tips for kernel build (0) | 2011.02.09 |