반응형

 안드로이드에서 프로세스간 RPC를 제공하기 위해서 바인더라는 서비스 프레임웍을 제공한다.리눅스에서 IPC를 위하여 여러 도구를 제공하지만(Messqge Queue, Shared Memory, Pipe, Socket 등) 안드로이드에서는 바인더를 통해서 단순 메시지 전달을 위한 IPC가 아니라 프로세스간의 RPC를 지원하는 것이다. 이를 위해서 커널 공간에서 동작하는 Binder Driver라는 추상화된 드라이버를 이용한다. 다음은 Unix Socket과 바인더의 차이점이다.


 바인더 드라이버는 ioctl 시스템 콜을 이용하여 다음 그림과 같이 RPC 데이터를 두 프로세스간에 전달하는 역활을 한다.




 IPC데이터는 사용하고자 하는 서비스번호(핸들),  호출할 함수명(RPC코드), 함수 인자(RPC Data), 바인더 프로토콜로 구성된다.

 각각의 계층은 상위-하위 계층의 데이터로 변환 또는 캡슐화 한다.


 

 바인더로 RPC를 시도하는 응용 프로그램은 binder_open()으로 파일 디스크립터를 얻고, binder_mmap으로 IPC데이터를 수신하기 위한 공유 공간을 확보하고, binder_ioctl으로 바인더 드라이버에 IPC데이터를 전달한다.


 ioctl명령은 ioctl(FIle_descriptor, ioctl_command, data_type) 형태이며, ioctl_command에 따른 data_type은 다음과 같다.


데이터 송신쪽의 IPC 계층에서 Binder Driver로 데이터가 가는 경우 BINDER COMMANDER PROTOCOL(BC_TRANSACTION)이라고 하며 그 데이터가 데이터 수신측으로 전달되는 경우(Binder Driver에서 IPC계층으로) BINDER RETURN PROTOCOL(BR_TRANSACTION) 이라고 한다.

 응답 프로토콜도 존재하며 각각에 매칭되는 것이 BC_REPLY와 BR_REPLYT이다.

Binder_Transaction


바인더 어드레싱(Binder Addressing)이란 바인더 드라이버가 IPC 데이터 핸들을 가지고 서비스 서버를 찾는 과정이다. 이를 위해서 서비스 서버는 자신의 서비스에 대한 접근 정보를 컨텍스트 매니저에 등록해야 한다. 


 [서비스 등록] 

 서비스 서버가 자신의 서비스에 대한 접근 정보를 컨텍스트 매니저에 등록하기 위해서 0번 핸들(컨텍스트 매니저)에 ADD_SERVICE라는 RPC Code와 등록할 이름을 RPC Data로 바인더 드라이버에 전달한다.

 바인더 드라이버는 서비스 서버에 대한 새로운 로드를 생성하고, 컨텍스트 매니저의 노드 참조 리스트의 마지막에 연결, 컨텍스트 매니저에 서비스 등록 요청을 하게 된다. 컨텍스트 매니저는 IPC데이터에 있는 서비스 이름과 바인더 노드의 번호를 서비스리스트에 등록한다.


 [서비스 검색] 

 서비스를 이용하고자 하는 클라이언트는 컨텍스트 매니저에게 이용하고자 하는 서비스 이름을 RPC데이터에, RPC Code는 "GET_SERVICE"로 핸들은 0번 핸들(컨텍스트 매니저)로 설정된 IPC데이터를 바인더 드라이버에 보낸다.

 바인더 드라이버는 컨텍스트 매니저에 해당 IPC데이터를 전달하고, 컨텍스트 매니저는 서비스 이름에 대한 서비스 번호를 확인하고 바인더 드라이버에 이를 전달한다. 바인더 드라이버는 컨텍스트매니저 노드 참조 리스트에서 해당 번호의 참조 노드를 조회, 이 노드가 가르키는 서비스 서버의 노드를 서비스 클라이언트 참조 노드가 가르키도록 하고 관련 핸들을 전달한다.


[서비스 이용]

 서비스 검색 후에 넘겨진 참조 번호를 이용해서 해당 핸들 번호로 IPC데이터를 생성해서 서비스 서버에 전달한다.


반응형
Posted by alias
,