1. 안드로이드 커널과 유저

기본적으로 안드로이드에서는 유저영역간에 서로 다른 프로세스에 접근이 불가능하다. A, B 프로세스가 존재한다면 A프로세스는 B프로세스에 관해 어떠한 명렁도 접근도 없다.

 

만약 A,B프로세스간 접근이 가능하다면 극단적인 경우를 예로들면 메모장 APK 해킹해서 메모장 APK 통해 은행 APK 해킹하는 등의 프로세스간 연쇄작용이 일어날 수도 있을 것이다.

 

하지만 위와 같이 프로세스간의 통신이 아예 불가능하다면 OS 운용하는데 현실적으로 불가능한 부분이 너무 많다. 이러한 문제 해결을 위해 안드로이드에서는 커널영역에서 프로세스간 메모리를 공유하는 방식을 통해서 프로세스간의 통신을 지원한다.

커널 영역은 유저 영역에 비해 상대적으로 안전하기 때문에 이러한 방법은 보안적으로도 좋은 방법이 된다고 생각한다.

 

위와같이 유정 영역에서는 프로세스간 접점이 존재하지 않으며 커널 영역에서는 프로세스간의 공유가 가능하다.

 

2. IPC, RPC

안드로이드 커널과 유저영역 그리고 프로세스간의 통신에 대해서 얘기를 진행했고 커널 메모리 공유 방법을 통해 프로세스간의 통신이 이루어지는 것을 확인했다. 여기서 IPC, RPC 커널영역을 통해 프로세스간 메모리를 공유하고 통신하는 방법이다.

안드로이드 프로세스간 통신을 간단히 구조화아면 위와 같다. RPC, IPC 통해서 커널영역에서 Binder 커널영역에서 연결 메모리를 공유한다.

여기서 RPC

프로세스 A, B 존재할 프로세스 A에서 프로세스 B 존재하는 fucntion 사용해야한다고 가정하자. 경우 안드로이드에서는 RPC 통해 프로세스 A에서 프로세스 B 존재하는 함수를 마치 자신(프로세스A) 정의된 함수 인것처럼 호출해서 사용할 있도록 지원한다.

application 개발자는 프로세스 B 존재하는 fucntion 그냥 프로세스 A 소스 코드에서 호출해서 사용이 가능하다.

 

IPC 커널영역에서 Binder Binder Driver 통해 프로세스간 연결을 진행하고 RPC fucntion 매개변수와 결과를 주고받을 있도록 지원한다.

 

1) Binder & Context manager

Binder 프로세스간의 통신을 위해 커널영역에서 프로세스간 연결 데이터 공유를 주관하는 말그대로 Binder 연결자이다.

그림과 같이 실제적으로 커널영역에서 프로세스간 연결 서비스 호출을 진행하는 역할을 Binder Driver 진행한다. 여기서 Binder Driver 호출을 요청받은 서비스를 찾아서 호출시키는 방법은 무엇일까?

 

해당 방법은 안드로이드 부팅 시점에 모든 서비스의 고유 idx 할당하고 이를 저장해서 관리하는 것이다. 부팅 이후 서비스 호출이 진행되면 idx값을 입력받아 해당 서비스를 찾아 호출하고 결과 값을 return 해준다.

모든 서비스를 목록화해서 관리하고 요청에 따라 실행하는 서비스 관리자가 존재하는데 그게 바로 Context Manager이다.

 

정리하면 Process A에서 Process B 함수를 사용하고자한다. 경우 Process A에서는 사용하고자 하는 함수에 대한정보를 RPC, IPC과정을 거쳐 Binder Driver에 전달한다. Binder Driver 해당 서비스를 찾기위해 Context Manager에게 전달하고 Context Manager 부팅초반에 만들어둔 서비스 목록화를 바탕으로 해당 서비스를 찾아준다. 그럼 Binder Driver 해당 서비스 위치로가서 서비스를 호출 결과를 받아온다.

 

 

2) RPC 계층

RPC코드와 RPC 데이터를 생성하는 영역이다. 쉽게 말해 Process A에서 Process B fucntion 사용하기 위한 준비과정이다.

안드로이드는 각각의 바인더되는 서비스를 모두 부팅시점에 idx 붙여 저장해두고 바인더를 통해 서비스를 호출할때 해당 idx 바탕으로 찾아가서 지원하는 방법을 이용한다. RPC 코드와 데이터를 생성하는 과정은 지금 호출하고자 하는 함수(사용하고자 하는 서비스) idx 등을 set하는 과정이다.

 

  • RPC Code : 호출하고자 하는 함수의 식별자
  • RPC Data : 호출하고자 하는 함수의 매개변수

 

3) IPC 계층

IPC 계층은 RPC, Binder Driver사이에서 데이터 포맷 변경을 바탕으로 사이를 이어주는 역할을 진행한다.

쉽계 얘기하면 인터넷 프로토콜과 같다. 인터넷 상에서는 많은 종류의 PC 존재하고 이러한 PC들이 데이터를 주고받는다. 과연 이러한 부품하나하나부터 S/W까지 모두 다른 PC들이 어떻게 통신을 주고받는 것일까? 해당 방법은 인터넷 data 주고받기 전에 데이터를 변환하기 때문이다.

인터넷상에서 data 주고받기 위한 프로토콜을 정하고 해당 프로토콜에 맞게 data 변환해서 송수신한다. 그리고 받은 data 다시 자신의 PC 해석할 있도록 디크립션을 해줌으로써 많은 다양한 PC 인터넷상에서 통신이 가능하다.

 

안드로이드 프로세스간의 통신도 인터넷상의 통신과 같다. RPC계층에서 호출하고자하는 함수에 대한 정보를 제공하면 IPC 해당 정보를 포함하여 Binder Driver 사용할 있도록 데이터를 인크립션한다. 그리고 Binder Driver로부터 데이터를 return받았을 때는 다시 Process 사용할 있도록 decrption하는 역할을 수행한다.

 

 

 

Ref)

http://windom.egloos.com/1865390

https://alnova2.tistory.com/1107

+ Recent posts