Android中的binder機制

2021-06-15 10:24:18 字數 3472 閱讀 4652

binder

使用client-server

的通訊方式:

乙個程序作為

server

/client

向server

傳送服務請求,獲得所需要的服務。 對於

binder

而言,binder

可以看成是

server

提供的實現某乙個特定服務的訪問接入點,

client

可以通過這個『位址』向

server

傳送服務請求來是用該服務;對於

client

而言,binder

可以看成是通向

server

的管道入口,要想和某乙個

server

通訊首先就要建立這個通道並且獲得通道入口。

binder

是乙個實體位於

server

中的物件,該物件提供一套方法用以實現對服務的請求,就像類的成員函式,

binder

框架定義了四個角色:

server

,client

,servicemanager

(以後簡稱

smgr

)以及驅動。其中

server

,client

,smgr

執行於使用者空間,驅動執行於核心空間。

binder

驅動雖然默默無聞,卻是通訊的核心。儘管名叫『驅動』,實際上和硬體裝置沒有任何關係,只是實現方式和裝置驅動程式是一樣的:它工作於核心態,提供

open()

,mmap()

,poll()

,ioctl()

等標準檔案操作,以字元驅動裝置中的

misc

裝置註冊在裝置目錄

/dev

下,使用者通過

/dev/binder

訪問該它。驅動負責程序之間

binder

通訊的建立,

binder

在程序之間的傳遞,

binder

引用計數管理,資料報在程序之間的傳遞和互動等一系列底層支援。驅動和應用程式之間定義了一套介面協議,主要功能由

ioctl()

介面實現,不提供

read()

,write()

介面,因為

ioctl()

靈活方便,且能夠一次呼叫實現先寫後讀以滿足同步互動,而不必分別呼叫

write()

和read()。

,smgr

的作用是將字元形式的

binder

名字轉化成

client

中對該binder

的引用,使得

client

能夠通過

binder

名字獲得對

server

中binder

實體的引用。

下面從mediaservice

的例子來分析

binder

的使用: 1

、servicemanager

,這是androidos

的整個服務的管理程式 2

、mediaservice

mediaplayerservice.3、

mediaplayerclient

,這個是與

mediaplayerservice

互動的客戶端程式。

首先是mediaservice

在frameworks/base/media/mediaserver/main_mediaserver.cpp中。

intmain(int argc, char** argv)

一步一步看: 1

、processstate

第乙個呼叫的是

processstate::self(),

然後負賦值給

proc

變數,程式執行完,

proc

會自動delete

內部的內容,所以就自動釋放了先前分配的資源。 在

frameworks/base/include/binder/processstate.cpp中

spprocessstate::self()

new的時候會呼叫

processstate

的建構函式,下面看看建構函式:

processstate::processstate() : mdriverfd(open_driver()) , mvmstart(map_failed)

,mmanagescontexts(false) , mbindercontextcheckfunc(null)

,mbindercontextuserdata(null) , mthreadpoolstarted(false) ,mthreadpoolseq(1)

#else

mdriverfd= -1;

#endif

}log_always_fatal_if(mdriverfd< 0, "binder driver could not be opened. terminating.");

}在建構函式的初始化列表中第乙個就是

open_driver(),

返回檔案指標,這個檔案指標在

mvmstart= mmap(0, binder_vm_size, prot_read, map_private | map_noreserve,mdriverfd, 0);

的時候使用,我們先看一下

open_driver()函式,

staticint open_driver()

if(result != 0 || vers != binder_current_protocol_version)

size_tmaxthreads = 15;

//通過

ioctl

告訴核心,這個

fd所支援的最大執行緒數是15。

result= ioctl(fd, binder_set_max_threads, &maxthreads);

if(result == -1)

}else

returnfd;

}到這裡

processstate::self()

就執行完了,它主要完成的工作有: 1

、開啟dev/binder

裝置,這樣的話就相當於和核心

binder

機制有了互動的通道 2

、對映fd

到記憶體中,裝置

fd傳進去之後,這塊記憶體和

binder

裝置共享了 2

、defaultservicemanager

所在的位置在

frameworks/base/lib/binder/iservicemanager.c中

spdefaultservicemanager()

} returngdefaultservicemanager;

}

Android 中的AIDL 和 binder機制

2.1 初識bindler android程序間的通訊基於binder機制,binder並非linux系統標準的通訊機制,android系統選定binder這種機制實現程序間通訊基於以下幾個考慮 1,效率高。相對於低效的socket,兩次複製的管道,使用了記憶體對映的binder效率高,只需一次複製...

Android知識鞏固 Binder

乙個程序空間分為 使用者空間 核心空間 kernel 即把程序內 使用者 核心 隔離開來 程序內 使用者 與 核心 進行互動 稱為系統呼叫 程序隔離 程序隔離是為保護作業系統中程序互不干擾而設計的一組不同硬體和軟體的技術。這個技術是為了避免程序a寫入程序b的情況發生。程序的隔離實現,使用了虛擬位址空...

白話Android程序互動之 Binder原理

房子是由一塊塊磚建起來的 而作業系統也一樣,是由乙個個簡單的模組組成。因此對待作業系統的底層原理,我們應該分解開,先看單獨的功能,然後在綜合起來看之間是如何配合的。很幸運的是,系統底層在設計上有很多復用的地方。因此當我們研究完一部分功能以後,再看另一部分,總會有似曾相識的感覺。在作業系統的實現中,有...