출처: 인사이드 안드로이드(위키북스출판)

RPC code & RPC data
서비스 클라이언트는 서비스서버에 존재하는 서비스의 함수를 사용하기 위해,
각 함수에 해당하는 식별자를 바인더 IPC데이터에 담아 전달 <-- RPC 코드
함수의 인자 역시 IPC데이터에 담아 전달                           <-- RPC 데이터

즉, 서비스 서버가 가진 서비스의 함수를 호출할려면, PRC코드를 알아야 함.

바인더 어드레싱
context manager : 다양한 서비를 모두 목록화해서 관리함.  서비스마다 핸들(바인더 IPC의 목적지 주소로 사용)이라는 번호값을 할당. 서비스의 추가/검색등의 관리기능을 수행.  %context manager의 핸들값은 0으로 지정되어 있음
바인더 드라이버는 IPC 데이터의 핸들을 가지고 서비스 서버를 찾는데, 이러한 과정을 바인더 어드레싱이라 함.

바인더 어드레싱을 위해 서비스 서버는 자신이 가진 서비스에 대한 접근 정보를 컨텍스트 매니저에 등록해야함.
서비스서버는 ADD_SERVICE라는 RPC코드와 등록할 서비스 이름(RPC데이터), 그리고 핸들을 0으로 지정하고IPC데이터에 실어 바인더 드라이버에 전달함.
바인더 드라이버는 먼저 핸들 0에 해당하는 바인더 노드를 찾음. 핸들 0에 해당하는 바인더 노드를 context manager를 의미하기 때문에 서비스 서버는 IPC데이터를 context manager에 전달함.
이후 바인더 드라이버는 서비스서버의 서비스 A에 해당하는 바인더 노드를 하나 생성함.  그리고 contenxt manager가 생성된 바인더 노드를 알수 있게 바인더 노드 참조 데이터를 생성해 해당 노드를 연결함.
참조 데이터는 생성된 순서대로 번호가 매겨지고, 이 번호는 ipc데이터에 담겨 context manger로 전달됨
context manager는 ipc데이터에 들어있는 서비스 이름과 바인더 노드의 번호를 서비스 리스트에 등록.

 %바인더 노드는 바인더 드라이버내 자료구조이며, 서비스마다 하나씩 존재함. 그리고 프로세스마다 바인더 노드들을 리스트로 가진다.(바인더 노드는 ipc의 대상이 되는 프로세스를 찾기 위한 식별자 정도로 이해하면 됨)

프로세스 관점에서의 서비스 사용
클라이언트던 서버 입장이던 다음과 같은 공통 작업을 거친다.
1. 바인더 드라이버 열기 open()함수 호출
2. IPC 데이터/응답 데이터 수신 버퍼 확보 mmap()함수 호출
3. 데이터 송신을 위한 ioctl()함수 호출

바인더 드라이버 관점에서의 서비스 사용
...

'안드로이드 > 프레임워크' 카테고리의 다른 글

Bionic libc (2)  (0) 2012.11.08
Bionic libc  (0) 2012.10.30
안드로이드 init.rc (oom_adj값)  (0) 2012.09.27
Dalvik Virtual Machine 와 odex  (0) 2012.08.13
안드로이드 프레임워크 *Java에서 전처리기 사용하기*  (0) 2011.06.06
Posted by code cat