Slide 1

Slide 1 text

Android Binder IPC for Linux 0456018 洪⾀昕

Slide 2

Slide 2 text

ANDROID BINDER IPC FOR LINUX Motivation ▸ Binder IPC subsystem is the core part of Android OS ▸ Activity, Service, BroadcastReceiver, ContentProvider ▸ ActivityManager, WindowManager, SurfaceFlinger ▸ Why Android propose another IPC mechanism? ▸ Feasibility of using Binder IPC on common Linux distros

Slide 3

Slide 3 text

In the Android platform, the binder is used for nearly everything that happens across processes in the core platform. Dianne Hackborn ANDROID BINDER IPC FOR LINUX

Slide 4

Slide 4 text

ANDROID BINDER IPC FOR LINUX Inter-Process Communication

Slide 5

Slide 5 text

ANDROID BINDER IPC FOR LINUX Unix IPC ▸ Pipe ▸ FIFO ▸ Socket ▸ SysV IPC ▸ Shared memory ▸ Message queue ▸ Semaphore

Slide 6

Slide 6 text

ANDROID BINDER IPC FOR LINUX Binder IPC ▸ Client/server architecture ▸ Remote procedure call ▸ Implemented as a Linux device driver ▸ Only one copy (from user to kernel) is needed

Slide 7

Slide 7 text

ANDROID BINDER IPC FOR LINUX Binder Architecture

Slide 8

Slide 8 text

ANDROID BINDER IPC FOR LINUX Binder Driver ▸ init() - Register a misc device (/dev/binder) ▸ open() - Open binder device ▸ mmap() - Allocate memory and map to kernel space ▸ ioctl() - Write/read IPC

Slide 9

Slide 9 text

ANDROID BINDER IPC FOR LINUX Binder Driver - initialization

Slide 10

Slide 10 text

ANDROID BINDER IPC FOR LINUX Binder Driver - device “file”

Slide 11

Slide 11 text

ANDROID BINDER IPC FOR LINUX Binder Driver - open device

Slide 12

Slide 12 text

ANDROID BINDER IPC FOR LINUX Binder Driver - memory map ▸ No more than 4MB

Slide 13

Slide 13 text

ANDROID BINDER IPC FOR LINUX Binder Driver - memory map

Slide 14

Slide 14 text

ANDROID BINDER IPC FOR LINUX Binder Driver - ioctl ▸ No read() & write() ▸ Commands ▸ BINDER_WRITE_READ ▸ BINDER_SET_MAX_THREADS ▸ BINDER_SET_CONTEXT_MGR ▸ BINDER_THREAD_EXIT

Slide 15

Slide 15 text

ANDROID BINDER IPC FOR LINUX Binder Driver - protocol ▸ BC_TRANSACTION <-> BR_TRANSACTION ▸ BC_REPLY <-> BR_REPLY ▸ ……

Slide 16

Slide 16 text

ANDROID BINDER IPC FOR LINUX Binder Driver - communication model

Slide 17

Slide 17 text

ANDROID BINDER IPC FOR LINUX Binder Driver - write

Slide 18

Slide 18 text

ANDROID BINDER IPC FOR LINUX Binder Driver - read

Slide 19

Slide 19 text

ANDROID BINDER IPC FOR LINUX Binder Driver - read

Slide 20

Slide 20 text

ANDROID BINDER IPC FOR LINUX Binder IPC subsystem

Slide 21

Slide 21 text

ANDROID BINDER IPC FOR LINUX Binder IPC subsystem - more! ▸ ProcessState, IPCThreadState ▸ Parcel ▸ AIDL

Slide 22

Slide 22 text

ANDROID BINDER IPC FOR LINUX Implementation ▸ Environment & code base ▸ Ubuntu 14.04.4 (Linux Kernel 4.2.0-27) ▸ Android 6.0.1_r46 ▸ Components to port ▸ binder & ashmem driver ▸ binder library ▸ Service Manager

Slide 23

Slide 23 text

ANDROID BINDER IPC FOR LINUX Issues & Challenges ▸ Not dynamic loadable ▸ Bionic C library ▸ Atomic library ▸ Dependencies to Android log daemon & SELinux

Slide 24

Slide 24 text

ANDROID BINDER IPC FOR LINUX Not dynamic loadable ▸ 10+ symbols are not exported by kernel ▸ Naive way: build kernel along with Binder driver statically ▸ Tricky way: kallsyms + function pointer redirection ▸ Run a shell script in Makefile ▸ Generate additional C source and header files ▸ Compile with Binder driver

Slide 25

Slide 25 text

ANDROID BINDER IPC FOR LINUX Not dynamic loadable

Slide 26

Slide 26 text

ANDROID BINDER IPC FOR LINUX Atomic library ▸ Have tried C++11 -> no luck :( ▸ x86 supports atomic fetch and add!

Slide 27

Slide 27 text

ANDROID BINDER IPC FOR LINUX Evaluation - correctness ▸ Integer Adder Service ▸ Client: a = iter, b = iter+3 -> Server: calculate a+b

Slide 28

Slide 28 text

ANDROID BINDER IPC FOR LINUX Evaluation - latency

Slide 29

Slide 29 text

ANDROID BINDER IPC FOR LINUX Evaluation - analysis ▸ Not suitable for large payload ▸ mmap allows only 4MB ▸ deferred work (e.g. release buffer) in workqueue ▸ global lock everywhere :(

Slide 30

Slide 30 text

ANDROID BINDER IPC FOR LINUX Reference ▸ Linux Kernel & Android Framework source code ▸ ̽窼獈ቘ薹 Android ໐ஞ戔懯௏మ - ໐ஞ薹䯤缰̾ ▸ Binder羬ڜ - Gityuan玡ਮ ▸ Android IPC Mechanism by jserv ▸ Deep Dive into Android IPC/Binder Framework