'안드로이드'에 해당되는 글 1건

  1. 2011.09.01 init이 ueventd를 호출하는 매커니즘

"안드로이드의 모든 것 분석과 포팅"이라는 책을 읽다가 도무지 이해되지 않는 코드.

 system/core/init/init.c에서 보면 
int main(int argc, char **argv) 
{
   ... ..
    if (!strcmp(basename(argv[0]), "ueventd"))

         return ueventd_main(argc, argv);
}

 여기서 argv[0]과 ueventd를 비교하는 데, 위 파일은 init의 소스 파일이며 argv[0]은 당연히
"/init"이 된다. basename은 경로명은 다 지우고 실제 파일 이름을 가져오는 함수로서 strcmp는 결국 "init"과 "ueventd"를 비교하여 0이 아닌 값을 돌려주게 되고 if문은 조건을 만족하지 못하여 ueventd_main은 실행하지 못하게 되는 것이다.

그런데 책에서는 위의 부분에서 ueventd_main이 실행된다고 하는 데, 어떻게 된 일일까?

해답은 argv[0]이 당연히 "/init"일 것이라는 것이 틀렸다는 사실. argv[0]은 대개 실행된 파일의 이름을 담고 있는 데, 리눅스에서는 실제 실행된 파일과 실행이름이 다를 수 있으니 이는 심볼릭 링크이다. 심볼릭 링크로 파일이 실행될 경우, argv[0]에는 심볼릭 링크의 이름이 들어가게 되는 것. 심볼릭 링크에 대한 자세한 설명은 아래 주소를 참고. 

심볼릭 링크 설명 : http://sunnmoon.egloos.com/1858692
 
즉 ueventd라는 이름의 심볼릭 링크가 있으며 해당 링크는 init과 연결되어 있는 것이다.

ueventd라는 이름의 심볼릭 링크는 그럼 어떻게 실행되는 것일까?
간단히 말하면 init이 실행되면서 init.rc를 분석하여 실행하는데, init.rc 초반에 "start uventd"라는 문구가 있어 ueventd를 실행하게 되는 것이었다!  
코드만 보면 도저히 못 찾을 뻔 했는데, 다행히 나와 비슷한 의문을 가진 사람들이 있어 
해답을 찾아서 다행이다. 

자세한 설명은 아래 링크를 참고 

ueventd 호출 매커니즘 : http://www.aesop.or.kr/?document_srl=451193&mid=Book_QnA

 

 

'안드로이드 > 안드로이드 커널' 카테고리의 다른 글

init이 ueventd를 호출하는 매커니즘  (0) 2011.09.01
Posted by 라판