Binder原理解析

binder通信的特點和原理

Android系統(tǒng)是基于Linux的世蔗,那么關(guān)于進程間的通信同樣我們也可以參考Linux,有以下幾種:
管道:需要copy兩次數(shù)據(jù)
共享內(nèi)存:不需要拷貝數(shù)據(jù)惹想,但是不安全
socket:需要拷貝兩次數(shù)據(jù)
File:同上
Binder:拷貝一次數(shù)據(jù)片任,安全
Binder通信是支持一對多這樣的C/S模型的稿茉,這樣S端就可以對C端進行驗證裤翩,安全新就有了保障。
在Linux系統(tǒng)中褐缠,用戶進程是無法直接操作磁盤的物理內(nèi)存的政鼠,必須經(jīng)過內(nèi)核才可以操作,Binder的機制就是將物理內(nèi)存通過mmap方法映射到用戶空間队魏,這樣用戶空間就可以拿到實際的地址進行操作公般。

Binder Native的啟動過程:

在service_manager.c文件中


1589755053(1).png

首先,先打開binder驅(qū)動胡桨,該驅(qū)動位于/dev/binder目錄下官帘,同時申請128k的內(nèi)存空間。


1589806538(1).png

可以看到昧谊,首先是打開binder驅(qū)動刽虹,然后通過mmap函數(shù)來內(nèi)存映射,這里mmap必須是page的整數(shù)倍呢诬,一般來說page為4K涌哲。mmap()系統(tǒng)調(diào)用使得進程之間通過映射同一個普通文件實現(xiàn)共享內(nèi)存。
參數(shù)介紹:

addr: 建立映射區(qū)的首地址尚镰,由Linux內(nèi)核指定阀圾。使用時,直接傳遞NULL狗唉。

length: 欲創(chuàng)建映射區(qū)的大小初烘。

prot: 映射區(qū)權(quán)限PROT_READ、PROT_WRITE分俯、PROT_READ|PROT_WRITE肾筐。

flags: 標志位參數(shù)(常用于設定更新物理區(qū)域、設置共享缸剪、創(chuàng)建匿名映射區(qū))吗铐;

MAP_SHARED: 會將映射區(qū)所做的操作反映到物理設備(磁盤)上。

MAP_PRIVATE: 映射區(qū)所做的修改不會反映到物理設備杏节。

fd: 用來建立映射區(qū)的文件描述符抓歼。

offset: 映射文件的偏移(4k的整數(shù)倍)。
下面我們嘗試自己通過mmap函數(shù)來在用戶空間來寫入文件(app需要先申請動態(tài)讀寫權(quán)限):

extern "C"
JNIEXPORT void JNICALL
Java_com_yppcat_test_MainActivity_writeMmap(JNIEnv *env, jobject thiz) {

__android_log_print(ANDROID_LOG_ERROR, "MMap", "write start");
std::string file = "/storage/emulated/0/test.txt";
m_fd = open(file.c_str(), O_RDWR | O_CREAT, S_IRWXU);
if (m_fd == -1){
    __android_log_print(ANDROID_LOG_ERROR, "MMap", "文件創(chuàng)建失敗");
}
__android_log_print(ANDROID_LOG_ERROR, "MMap", "write 111");
m_size = getpagesize();
ftruncate(m_fd, m_size);
m_ptr = static_cast<int8_t *>(mmap(0, m_size, PROT_READ | PROT_WRITE, MAP_SHARED, m_fd, 0));
if (m_ptr == MAP_FAILED){
    __android_log_print(ANDROID_LOG_ERROR, "MMap", "映射位圖失敗");
}
std::string data("大保健 我要去");
memcpy(m_ptr, data.data(), data.size());
msync(m_ptr,m_size,MS_ASYNC);
munmap(m_ptr,m_size);
__android_log_print(ANDROID_LOG_ERROR, "MMap", "write finished");

}


1589846320(1).png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拢锹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子萄喳,更是在濱河造成了極大的恐慌卒稳,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件他巨,死亡現(xiàn)場離奇詭異充坑,居然都是意外死亡减江,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門捻爷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辈灼,“玉大人,你說我怎么就攤上這事也榄⊙灿ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵甜紫,是天一觀的道長降宅。 經(jīng)常有香客問我,道長囚霸,這世上最難降的妖魔是什么腰根? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮拓型,結(jié)果婚禮上额嘿,老公的妹妹穿的比我還像新娘。我一直安慰自己劣挫,他們只是感情好册养,可當我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著揣云,像睡著了一般捕儒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邓夕,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天刘莹,我揣著相機與錄音,去河邊找鬼焚刚。 笑死点弯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的矿咕。 我是一名探鬼主播抢肛,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碳柱!你這毒婦竟也來了捡絮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤莲镣,失蹤者是張志新(化名)和其女友劉穎福稳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瑞侮,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡的圆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年鼓拧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片越妈。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡季俩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梅掠,到底是詐尸還是另有隱情酌住,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布瓤檐,位于F島的核電站赂韵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挠蛉。R本人自食惡果不足惜祭示,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谴古。 院中可真熱鬧质涛,春花似錦、人聲如沸掰担。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽带饱。三九已至毡代,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勺疼,已是汗流浹背教寂。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留执庐,地道東北人酪耕。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像轨淌,于是被迫代替她去往敵國和親迂烁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,595評論 2 350