1. Boot ROM
- POWER 버튼을 누르면, ROM 내부의 Boot ROM 코드가 실행된다.
- RAM으로 Bootloader의 첫 번째 단계를 로드한다.
2. Boot Loader
- OS 시작 전 실행되는 코드이다.
- 장치가 어떻게 시작하는지 알려주고 kernel을 찾는 명령어를 가진 low-level 코드이다.
- 메모리(RAM) 초기화
- Kernel 로드
- Boot Loader 경로
- <android source>/bootable/bootloader/legacy/usbloader
- Boot Loader는 비휘발성 메모리에 상주한다.
- 2단계로 진행된다.
- Primary Boot Loader
- Secondary Boot Loader를 디스크 내 특정 위치에서 로드한다.
- Secondary Boot Loader
- 메모리(RAM) 초기화
- RAM의 "boot" flash 위치에 Kernel을 로드한다.
3. Android Kernel
- 커널이 로드되면, 캐시, 메모리 보호, 예약, 인터럽트 컨트롤러, 스케줄링를 설정하고 드라이버를 로드한다.
- Kernel이 시스템 세팅이 끝나면, 시스템 파일 내에서 "init" 을 찾는다.
Android Kernel에서 Linux Kernel에 추가한 것
Binder
- Android-specific interprocess communication mechanism
ashmem
- Android Shared Memory
- file-based API인 공유 메모리 allocator
pmem
- Process memory allocator
- 사용자 공간과 kernel 드라이버 사이에서 공유되는 큰 물리적 메모리 공간(1-16+KB)을 관리하는 역할
logger
wakelocks
- 전원 관리 파일에 사용된다.
- wake lock이 일어나기 전까지 머신을 깨워놓는다.
oom handling
- 프로세스들을 죽여서 메모리가 낮아질 수 있도록 한다.
RAM_CONSOLE
- kernel printk 메시지를 RAM 내 버퍼에 저장할 수 있도록 한다.
- kernel panic 후 다음 커널이 실행될 때 볼 수 있다.
USB
yaffs2
4. Init Process
- 첫 번째 프로세스로, 모든 프로세스들의 루트 프로세스 (조상 프로세스)
- 파일 시스템(/sys, /dev, /proc 등)을 마운트
- init.rc 스크립트 파싱해서 실행한다.
- 이 과정에서 Zygote와 System Process 가 실행된다.
- init.rc 경로
- <android source>/system/core/rootdir/
- Zygote와 System Process를 실행한다.
- Init process 경로
- <android source>/system/core/init
5. Zygote
- 안드로이드 애플리케이션은 자바로 작성되었는데, Linux 네이티브 프로세스로는 실행할 수 없어 Dalvik VM 위에서 실행된다.
- 모든 자바 클래스들과 자원들을 미리 로드한다.
- 사전에 로드한 자원 연결정보를 사용하기 때문에 애플리케이션을 빠르게 실행할 수 있다.
- Zygote는 애플리케이션 실행에 필요한 VM 코드 및 메모리 정보를 공유해서 실행 시간을 단축한다.
- 가상머신에서 애플리케이션 실행 위한 모든 준비를 마치고, 애플리케이션 실행 시에는 fork()를 통해 복제된 Zygote 프로세스 위 Dalvik VM 위에서 애플리케이션이 실행된다.
- system boot를 시작하는 Virtual Machine 프로세스이다.
- System Server를 실행한다.
- COW(Copy on Write) 방식 사용 - 메모리 사용 최소화
6. System Servers
- 핵심 Android 서비스를 실행한다.
- 각 서비스에 대해 서비스를 초기화하고, Service Manager에 등록한다.
Reference
Android Boot Process
source.android.com/devices/automotive/power/boot_time