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