Android OS 부팅 순서와 자료 구조

728x90

안드로이드 부팅 순서(간략화)

- 부트 로더 > 리눅스 커널 > init process > Native daemons > Zygote > system_server > 응용 프로그램

 

1) ROM

CPU에 전원이 인가되면, 지정 번지의 ROM code를 찾아 실행한다. 이때, ROM code는 Bootloader를 RAM에 적재시키는 역할을 한다.

 

2) Bootloader

RAM과 하드웨어를 초기화하고, 커널과 램 디스크를 RAM으로 올린다. 커널의 시작 지점으로 점프해 불러들인다.

OS 시작 전 실행되는 코드이며 장치가 어떻게 시작하는지 알려주고, 커널을 찾는 명령어를 가진 저수준 코드이다.

<android source>/bootable/bootloader/legacy/usbloader

부트로더는 위의 경로대로 비휘발성 메모리에 상주하며 2단계로 역할을 수행한다.

 

3) Kernel

code 실행 환경 준비, 커널 서브시스템 및 디바이스 드라이버 초기화, rootFS mount, init process 구동 등을 수행한다.

쉽게 말해, 커널이 로드되면 캐시와 메모리를 보호하고 예약하며, 인터럽트 컨트롤러와 스케줄링을 설정한 뒤 드라이버를 로드한다. 커널 시스템 세팅이 끝나면 시스템 파일 내에서 init 프로세스를 찾는다.

 

4) init Process

환경 변수 설정, 마운트 위치 생성, 여러 파일 시스템을 마운트하고 마운트된 파일 시스템의 파일 퍼미션을 설정한다.

-> init process에 의해 여러 native demon이 실행된다. (ex. service Manager, neted 등)

 

/* init 프로세서가 실행하는 주요 데몬 프로세스 */

- USB 데몬: usbd

- 안드로이드 디버그 브릿지 데몬: adbd

- 디버그 데몬: debuggerd

- 무선 인터페이스 레이어 데몬: rild

 

5) Context Manager

안드로이드의 시스템 서비스를 관리하는 중요 프로세서이다.  카메라, 오디오, 비디오 처리에서부터 애플리케이션 제작에 필요한 API를 제공하기도 한다.

 

6) Media Server

오디오출력, 카메라 서비스와 같이 C/C++ 기반으로 작성되어 있는 네이티브 시스템 서비스를 실행하는 역할을 한다. 이 단계가 완료되어야 디바이스에서 소리를 실행시킬 수 있다.

 

7) Zygote, Dalvik VM

자이고트는 안드로이드 애플리케이션의 로딩시간을 단축시키기 위한 프로세스이다. 모든 자바 기반 안드로이드 애플리케이션은 자이고트를 통해 포크(fork)된 프로세스 상에서 동작하게 된다.

 

달빅 가상머신은 애플리케이션 샌드박스를 만들기 위해 구글이 선택한 기술이다. 모든 자바기반 안드로이드 애플리케이션을 처리해주게 된다.

 

** 자이고트는 애플리케이션 실행에 필요한 VM 코드 및 메모리 정보를 공유해 실행 시간을 단축한다. 가상머신에서 애플리케이션 실행을 위한 모든 준비를 마치고 fork()를 통해 복제된 Zygote 프로세스 위의 Dalvik VM 위에서 애플리케이션이 실행된다. **

 

 

8) Syetem Server

자이고트에서 최초로 fork()되어 실행되는 안드로이드 애플리케이션 프로세서이다. 핵심 안드로이드 서비스를 실행하며 각 서비스에 제공되는 또 하나의 서비스들을 초기화하고 Service Manager에 등록한다.

 

핵심 안드로이드 서비스의 예로는 로케이션매니저(위치추적)과 같은 자바 서비스가 있다.

바인더 IPC를 통해 자바시스템서비스를 C언어 기반의 서비스매니저에 등록하기 위해 JNI를 이용하기도 한다.

 

9) Activity Manager Service

자바 시스템 서비스가 모두 로딩되고 나면 액티비티 매니저 서비스가 HOME 어플을 실행하면서 사용자가 보는 화면을 서비스해준다.

728x90