- 리눅스와 마찬가지로 안드로이드에서는 커널 부팅이 완료되면 최초의 사용자 프로세스인 init 프로세스를 실행 한다.



 리눅스의 프로세스들은 서로 정보를 교환하기 위해 메시지를 주고 받는데, 이러한 메시지를 시그널이라고 한다. 그리고 각 프로세스는 다른 프로세스에서 발생하는 시그널을 처리하기 위한 루틴을 등록하는데 이를 시그널 핸들러라고 한다. 시그널에는 프로세스의 실행 상태가 변경되거나 종료됐을때 발생하는 시그널이 있으며, 모든 프로세스의 부모인 init 프로세스는 자신이 생성한 프로세스가 종료됐을 때 발생하는 SIGCHLD 시그널을 처리할 핸들러를 등록한다. 시그널에 대한 실제 처리는 init 프로세스 동작 과정의 마지막 단계인 이벤트 처리 루프에서 수행된다.

- 안드로이드 init 프로세스는 다음과 같이 크게 4가지 기능을 수행한다.


① init.rc 파일 분석 및 실행
 : init 프로세스가 해야 할 일을 기술한 init.rc 파일을 분석해서 해당 파일에 담긴 내용에 따른 기능을 수행 한다. 



Figure 1. Android root file system

 - 액션 리스트
  : 'on init' 섹션에서는 환경변수를 등록하고, 시스템 동작 시 필요한 파일 및 디렉터리 생성하고 퍼미션을 조작, 시스템 동작과 관련된 디렉터리 /system, /data를 마운트
  : 'on boot' 섹션에서는 애플리케이션 종료 조건 설정, 애플리케이션 구동에 필요한 디렉터리 및 파일 퍼미션 설정 등
 - 서비스 리스트
  : init.rc 파일에서 'service' 섹션은 init 프로세스가 실행시키는 프로세스를 기술
 - init.rc 파싱 코드 분석
 - 액션리스트 및 서비스 리스트의 실행

② 디바이스 드라이버 노드 생성
 : 응용 프로그램이 디바이스 드라이버에 접근할 때 사용하기 위한 디바이스 노드 파일을 생성 
 init 프로세스는 시그널 핸들러를 등록한 후 부팅에 필요한 디렉터리를 생성하고 마운트한다. 안드로이드 빌드를 통해 생성되는 루트 파일 시스템은 /dev, /proc, /sys와 같은 디렉터리가 존재 하지 않는다. 이러한 디렉터리는 시스템의 운용 중에만 필요한 디렉터리로 init 프로세스가 동작 중에 생성하고 시스템이 종료되면 다시 사라진다.
 : 리눅스 커널 2.6 미만에서는 디바이스 노드 파일을 사용자가 직접 만들어야 했다. 이때 노드 파일에 필요한 메이저 번호와 마이너 번호를 겹치지 않게 만든 다음 mknod 유틸리티를 통해 생성했다. 하지만 사용자가 일일이 메이저 번호와 마이너 번호를 알아야 했고 번호 간의 충돌을 주의해야 하는 등의 불편함 때문에 커널 2.6x부터는 udev(userspace device)라는 유틸리티 등장. udev는 데몬 프로세스로 동작하면서 디바이스 드라이버가 로딩될 때 메이저 번호와 마이너 번호, 디바이스 타입을 파악해서 "/dev" 디렉터리에 자동으로 디바이스 노드 파일을 생성하는 역할을 한다. 


 

 - 정적 디바이스 노드 생성(콜드플러그)
 - 동적 디바이스 감지(핫플러그)


자식 프로세스 종료 처리
 : 리눅스상에서 동작하는 모든 프로세스는 init 프로세스에서 생성되어 실행된다.
 리눅스 커널이 부팅하고 나면 사용자 영역에서 init 프로세스가 최로로 실행된 다음 시스템 동작에 필요한 다른 프로세스들을 순차적으로 실행시킨다. 시스템 부팅이 완료된 이후, init 프로세스는 백그라운드 프로세스로 동작하면서 다른 프로세스를 감시한다. 만약 감시중인 프로세스가 종료되어 좀비 상
태가 되면 해당 프로세스가 가진 자원이 정상적으로 반환되게 하는 역할을 수행한다. 안드로이드 플랫폼의 init 프로세스는 일반적인 리눅스 상의 init 프로세스가 수행하는 기능 외에도 몇 가지 추가적인 기능을 수행한다. 




 - 프로세스 종료와 재시작

④ 프로퍼티 서비스
 : 시스템 동작에 필요한 환경 변수를 저장하는 프로퍼티 서비스를 제공한다.

 

 - 프로퍼티 초기화
 - 프로퍼티 변경 요청 처리

POLL 서버(메인 루프)


'Programing > Android' 카테고리의 다른 글

안드로이드 - Zygote  (0) 2016.01.06
안드로이드 - JNI  (0) 2015.12.23
안드로이드 - 커널  (0) 2015.12.21
안드로이드 - 뷰  (0) 2015.12.21
안드로이드 - 4대 컴포넌트  (0) 2015.12.21

+ Recent posts