본문 바로가기
Android

인사이드 안드로이드 07 바인더 IPC (1)

by OKOK 2021. 5. 17.

안드로이드 바인더 IPC

구글로 옮겨간 핵복은 안드로이드의 프로세스를 관리하기 위해 오픈 바인더를 수정한 안드로이드 바인더(이하 바인더)를 개발함. 바인더는 원래 IPC 도구이지만 안드로이드에서는 다른 프로세스에 있는 함수를 마치 현재 프로세스에 존재하는 함수처럼 사용할 수 있게 해주는 RPC를 지원하는 데 주로 이용됨. 

 

7.1 리눅스 메모리 공간과 바인더 드라이버

프로세스만의 고유한 가상 주소 공간에서 실행됨. 총 4GB에 달하는 가상 주소 공간은 3GB의 사용자 공간과 1GB의 커널 공간으로 나뉨. (커널 설정으로 변경 가능함). 사용자 코드와 관련 라이브러리는 사용자 공간의 코드 영역, 데이터 영역, 스택 영역에서 동작하고, 커널 공간에서 동작해야 할 코드는 커널 공간의 각 영역에서 동작함. 프로세스 간 공유가 가능한 커널 공간을 이용하는 것. 바로 커널 공간을 통해 화면 출력 요청 메시지를 전달하는 것임. 커널 공간에서 동작하는 바인더 드라이버라는 추상화된 드라이버를 이용함. 바인더는 리눅스의 뛰어난 메모리 관리 기법을 그대로 채용함. 사용자 공간에서 접근할 수 없는 공간인 커널 공간을 이용해 데이터를 주고받기 때문에 IPC 간의 보안 문제도 동시에 해결할 수 있음. 

 

7.2 안드로이드 바인더 모델

Surface Fligner 서비스를 제공하는 서비스 서버. 이 예제에서 프로세스 A와 B는 Surface Flinger 서비스를 이용하는ㅇ서비스 클라이언트가 되고 프로세스 C는 서비스 서버가 됨. 사용하고자 하는 서비스에 해당하는 번호와 호출할 함수명, 바인더 프로토콜로 구성됨. 바인더 프로토콜은 바인더 드라이버와 바인더를 이용하는 프로세스 간의 IPC 데이터를 처리하는 규약임. 핸들은 서비스를 구별하는 번호를 의미함. 

 

7.2.1 바인더 IPC 데이터의 전달

문자 디바이스 드라이버처럼 open()이나 ioctl()과 같은 시스템 콜을 통해 접근 가능함. 시스템 콜에 open, mmap, ioctl 이 있고, 바인더 드라이버에 binder_open, binder_mmap, binder_ioctl임. 바인더 IPC 데이터를 전달하는 데 초점을 맞추기 위해 앞으로는 BINDER_WRITE_READ에 따른 바인더 드라이버의 동작에 관해서 설명하겠음. 

 

7.2.2 바인더 IPC 데이터의 흐름

바인더 IPC 데이터가 서비스 클라이언트에서 서비스 서버로 전달되기까지 어떠한 과정을 거치는지 볼 것. 

서비스 계층 : 서비스 클라이언트는 이 계층에서 사용하고자 하는 서비스의 함수를 가상으로 호출하고, 서비스 서버는 서비스 클라이언트가 요청한 서비스의 함수를 실제로 호출함

RPC 계층 : 이 계층에서 서비스의 함수를 호출하기 위한 RPC코드와 RPC 데이터를 생성함. 

IPC 계층 : RPC 계층에서 만든 RPC 코드와 RPC 데이터를 바인더 드라이버에 전달하기 위한 바인더 IPC 데이터로 캡슐화 화하는 역할을 함.

바인더 드라이버 계층: IPC 계층으로부터 전달받은 바인더 IPC 데이터를 통해 서비스를 가진 서비스 서버를 찾은 후 IPC 데이터를 전달함

 

7.2.3 바인더 프로토콜

바인더 프로토콜이 IPC계층에서 바인더 드라이버로 전송될 때는 "BINDER COMMNAD PROTOCOL" 이라고 하고, 바인더 드라이버에는 IPC 계층으로 전달될 때는 "BINDER RETURN PROTOCOL"이라 한다. 네트워크 상에서 쓰는 프로토콜처럼 데이터를 송신하는 측과 수신하는 측에서 모두 알고 있는 규약임. 결국 RPC 코드가 서비스 서버의 함수를 결정하는 것. IPC 응답 데이터와 REPLY 바인더 프로토콜. 

 

mp3 앱은 음악 재생 중에 볼륨 조정이 필요한 경우 하드웨어 볼륨 조정을 담당하는 Audio Fligner 서비스를 가진 서비스 서버에게 요청해야 함. RPC 코드가 SET_MASTER VLOULME일 경우 Audio Flinger에서 setMasterVoulme() 함수를 호출함

 

7.2.5 바인더 어드레싱

다양한 서비스를 모두 목록화해서 관리하는 컨텐스트 매니저(Context Manager) 특별한 프로세스. 서비스마다 핸들(바인더 IPC의 목적지 주소로 사용)이라는 번호 값을 할당하고, 서비스의 추가/검색 등의 관리 기능을 수행함. 바인더 드라이버는 아피씨 데이터의 핸들을 가지고 서비스 서버를 찾는데, 이를 바인더 어드레싱이라고 함. 서비스 클라이언트 쪽에 참조 데이터를 생성해 컨텍스트 매니저의 참조 데이터가 가리키는 바인더 노드를 연결함. 실제 바인더 드라이버의 연결 구조를 알고 싶다면 7.3.3절 바인더 드라이버 함수 분석을 살펴보길 바람.

댓글