안녕하세요.
고도리입니다.
binder 관련 자료를 보강할 겸 다시 올립니다.
책의 그림들이 좀 부실한데다가 틀린 그림이 올라간 듯 해서요.
====================================================================
0. servicemanager란????
binder 서버 중 특수한 서버라고 생각하시면 됩니다.
binder관련해서 가장 먼저 실행되는 서버로 context manager라고 불립니다.
context manager라는 것은 한마디로, 바인더의 등록 부분들을 "관리"한다는 뜻입니다.
주로 하는 일은
- binder서버의 등록
- 등록된 바인더 서버에 접속하기 위한 client로부터의 요청을 받고, 등록된 바인더 서버로의 접속 포인트를
가르쳐 주는겁니다.
저는 보통 "번호표" 뽑아주는 녀석이라 얘기합니다...^^
1. servicemanager의 실행
binder의 시작은 안드로이드 init가 동작하면서 init.rc의 내용을 parsing 한 후 시작됩니다.
다음은 init.rc의 내용을 발췌한 것입니다.
service servicemanager /system/bin/servicemanager
user system
critical
onrestart restart zygote
onrestart restart media
여기의 내용을 보면 servicemanager 서비스를 실행할 때 system 사용자로(AID_SYSTEM) 시작을 시키도록 되어 있고, 재미있는 것은
onrestart restart zygote
onrestart restart media
이 문법인데, 이 것은
"servicemanager 서비스가 restart 할 때 zygote와 media service를 restart 하라"라는 문법입니다.
2. servicemanager의 동작
1> servicemanager는 부팅시 Binder driver의 내부 서비스 노드의 Node 0로 등록을 합니다.
Node 0는 특권을 갖는 녀석이라고 보시면 됩니다.
2> 다음의 그림은 servicemanager에 AudioFlinger 서비스가 등록되는 그림입니다.
순서는 번호를 보시면 됩니다.....
servicemanager는 부팅시 Node 0로 등록, 등록은 servicemanager로 요청이 됩니다. 왜 servicemanager가 node 0를 차지하냐 하면 AudioFlinger는 servicemanager가 어디에 있는지 찾을 방법이 없습니다. 왜냐고요????
서로 다른 process 이기 때문에 전혀 메모리 영역이 겹치지 않습니다. AudioFlinger입장에서는 servicemanager가 실제로 어디있는지 찾을 방법이 없습니다. 단, 커널만이 알고 있을 뿐입니다.
해서 servicemanager가 등록이 된 후 AudioFlinger는 servicemanager가 어디 있는지 찾기 위해서는 binder library를 통해서 드라이버의 Node 0로만 메세지를 보내게 되면 자동으로 servicemanager가 알아채는 겁니다.
내용이야 어떻든 가장 중요한 것은 "process가 다르기 때문에 다른 프로세스의 위치를 찾기 힘들다" 입니다.
3> 자 그럼..........이제는 client가 AudioFlinger로 접속하기 위한 방법을 보도록 하겠습니다.
client는 audio쪽을 사용하는 mp3 player로 정했습니다.
mp3 player는 AudioFlinger로 접속하기 위해서는 한가지 일을 처리해야합니다.
"AudioFlinger는 어디있을까????" 라는 문제를요.
왜냐하면 mp3 player와 AudioFlinger는 서로 다른 process이기 때문에 실제로는 AudioFlinger로 접속할 방법이
없습니다. 즉, 어디에 있는지 있는지 조차도 모르는 것이지요.
해서 mp3 player, 즉, binder client는 AudioFlinger로 접속하기 위하여 servicemanager에 물어봐야 합니다.
왜냐? 원래 servicemanager의 역할이 이런 것이거든요. 해서 mp3 player는 Node 0로 AudioFlinger의 Node 위치를
물어보게 되는 것입니다.
4> mp3 player가 AudioFlinger로 접속
mp3 player는 servicemanager의 도움으로 AudioFlinger와 통신할 수 있는 Node n을 얻어냅니다.
그 후로부터는 AudioFlinger로 접속해서 mp3 play를 할 수 있게 됩니다.
ps> 여기 사용하는 글과 그림은 마음대로 쓰셔도 됩니다.......This contents are free