원문이 존재하는 글입니다
전원이 인가되었을 때 CPU는 초기화가 완료되지 않은 상태이고, 내부 클럭 역시 초기화되지 않은 상태이다. 이 상태에서는 CPU 내부의 RAM만 사용가능한 상태이다. 전원 공급이 안정화되면 Boot ROM 코드가 시작이 된다. Boot ROM 코드는 아주 작은 코드로서 CPU ASIC에 내장 되어있다.
A. Boot ROM은 ASIC의 특정 위치에 저장되어 있는 시스템 레지스터의 값을 읽어 Boot Media를 찾게 된다. 이 과정이 부트 로더의 시작을 어디서 찾아야 하는지 결정하는 과정이다.
B. Boot Media를 찾는 과정이 완료되고 나면 boot ROM은 CPU의 Internal RAM에 Boot Loader를 적재한다. Boot loader가 Boot ROM에 적재되고 나면 code를 Boot Loader로 이동시켜 실행을 계속하게 된다.
부트 로더라는 놈은 리눅스 커널과는 별도로 메모리를 초기화하고 Kernel을 RAM에 적재하는 역할을 하는 프로그램을 말한다. 데스크탑 시스템에서는 리눅스의 uBoot 이라고 생각하면 된다. 디바이스의 제조사들은 각기 그들만의 boot loader를 사용하는 경우가 많다. ARM 시스템에서 리눅스를 위한 부트 로더에 대한 requirement는 커널 소스트리의 /Documentation/arm 아래에 존재한다.
A. 첫 번째 부트로더 스테이지로 external RAM을 Detect하고 setup 한다.
B. external RAM이 사용가능해지면 external RAM에 부터로더를 적재한다.
C. 부트로더는 첫번째 Major 프로그램을 수행한다. 여기에는 file system, additional memory 네트워크등을 설정한다. 모바일폰에 있어서는 CP(communication Processor)를 위한 코드를 로딩하고 시큐리티 옵션과 로우레벨 메모리 프로텍션을 설정한다.
D. 위와 같은 일련의 작업들이 끝이나면 Linux의 부팅을 위해서 커널을 찾게 된다. Boot Media로 부터 커널을 로딩하고 이를 RAM에 적재한다. 또한 이 과정 중에 커널이 시작되면서 필요한 메모리의 파라메터들을 설정한다.
E. 부트로더에서의 일련의 과정이 끝나고 나면 리눅스 커널이 시작이 된다. 일반적으로 압축 해제 루틴이 돌고 시스템에 대한 권한은 커널로 넘어가게 된다.
안드로이드에서의 리눅스 커널의 시작은 다른 시스템들과 유사하다. 리눅스 시스템은 해당 시스템이 동작하는데 필요한 모든 사항을 설정한다. 인터럽트 컨트롤러를 초기화 하고, 메모리 프로텍션, 캐시 그리고 스케쥴링을 설정한다.
A. MMU(Memory Management Unit)과 캐시가 시스템에서 초기화 되고 나면 시스템은 버추얼 메모리와 유저스페이스 프로세스를 실행 할 수 있게 된다.
B. 커널은 init 프로세스를 위해서 루트 파일시스템을 볼 수 있게 하고 초기 유저 스페이스 프로세스를 런칭한다.
init 프로세스는 모든 시스템 프로세스들의 할머니 프로세스라고 할 수 있다. 시스템 내의 모든 프로세스들은 이 프로세스로 부터 시작이 되거나 init 프로세스의 자손 프로세스로 실행이 된다.
A. 안드로이드에 있어서 init 프로세스는 init.rc라는 파일을 호출한다. 이것은 스크립트 파일인데 시스템 서비스, 파일 시스템과 설정해야할 파라메터들에 대한 내용을 담고 있다. init.rc 파일은 system/core/rootdir에 존재하게 된다.
B. init 프로세스는 init.rc 파일을 파싱하고 시스템 서비스 프로세스들을 시작하도록 한다.
Zygote는 init 프로세스에 의해서 시작이 되고, Dalvik VM을 초기화 한다.
시스템 서버들은 시스템 내에서 처음으로 수행되는 자바 컴포넌트들이다. 시스템 서버는 Telephony manager, bluetooth와 같은 안드로이드 서비스들을 시작시킨다. 시작된 각 서비스들은 시스템 서버안에 run 메소드로 직접 코딩되어 있다. 시스템 서버의 소스는 frameworks/base/services/java/com/jandroid/system/SystemServer.java로 open source이다.
시스템 서버가 시작이 되어 실행이 되고 시스템 부팅이 완료되면 ACTION_BOOT_COMPLETED라 불리는 것이 broadcast 된다. 당신이 직접 만든 서비스를 시작하기 위해서나 알람을 등록하거나 시스템이 부팅된 후에 특정 동작을 하기 위한 Application을 만들 것이라면 반드시 ACTION_BOOT_COMPLETED라는 intent를 받은 후에 수행해야 한다.