七十厢、Binder 機(jī)制初探

Read The Fucking Source Code

0. 準(zhǔn)備工作

首先問自己幾個問題:

  • 為什么要跨進(jìn)程通信(IPC)碟联? (進(jìn)程之間是不可以通信的嗎)
  • 怎么做到跨進(jìn)程通信? (怎樣用常規(guī)的方式在兩個進(jìn)程之間進(jìn)行通信呢)
  • 為什么是 Binder 柿冲? (為什么常規(guī)的跨進(jìn)程方式不行谭期,而要專門使用 Binder)

回答這幾個問題撵割,我們得先了解一下幾個概念结胀。為后面做鋪墊朵栖。

Android 系統(tǒng)是基于 Linux 內(nèi)核的丽猬,因此有必要了解一些相關(guān)知識。

0.1 進(jìn)程隔離

進(jìn)程隔離是為保護(hù)操作系統(tǒng)中進(jìn)程互不干擾而設(shè)計的一組不同硬件和軟件的技術(shù)鸳劳。這個技術(shù)是為了避免 進(jìn)程A 寫入 進(jìn)程B 的情況發(fā)生狰贯。 進(jìn)程的隔離實現(xiàn)也搓,使用了虛擬地址空間赏廓。進(jìn)程A 的虛擬地址和 進(jìn)程B 的虛擬地址不同涵紊,這樣就防止 進(jìn)程A 將數(shù)據(jù)信息寫入 進(jìn)程B。

以上來自維基百科:進(jìn)程隔離的安全性通過禁止進(jìn)程間內(nèi)存的訪問可以方便實現(xiàn)幔摸。相比之下摸柄,一些不安全的操作系統(tǒng)(例如DOS)能夠允許任何進(jìn)程對其他進(jìn)程的內(nèi)存進(jìn)行寫操作。

根據(jù)以上描述既忆,我們可以知道 操作系統(tǒng)的不同進(jìn)程之間驱负,數(shù)據(jù)是不共享的,即禁止進(jìn)程間內(nèi)存的訪問患雇。因此我們可以回答第一個問題跃脊。
Q:為什么要跨進(jìn)程通信
A:根據(jù)上述可以得知,進(jìn)程之間是不可以進(jìn)行通信的苛吱,所以我們需要有某種方式來完成 跨進(jìn)程通信酪术。

0.2 用戶空間 / 內(nèi)核空間

詳細(xì)解釋可參考 Kernel Space Definition

Linux 系統(tǒng)內(nèi)存可以分為兩個不同的區(qū)域:內(nèi)核空間用戶空間
內(nèi)核空間是內(nèi)核(即操作系統(tǒng)的核心)執(zhí)行(即運行)并提供其服務(wù)的地方翠储。
用戶空間是指 用戶進(jìn)程(即內(nèi)核以外的所有內(nèi)容)運行的內(nèi)存位置集绘雁。

Linux Kernel 是操作系統(tǒng)的核心,獨立于普通的應(yīng)用程序援所,可以訪問受保護(hù)的內(nèi)存空間庐舟,也有訪問底層硬件設(shè)備的所有權(quán)限。 內(nèi)核的一個角色是管理這個空間中的各個用戶進(jìn)程住拭,并防止它們相互干擾挪略。
對于Kernel這么一個高安全級別的東西,顯然是不容許其它的應(yīng)用程序隨便調(diào)用或訪問的滔岳,所以需要對Kernel提供一定的保護(hù)機(jī)制瘟檩,這個保護(hù)機(jī)制用來告訴那些應(yīng)用程序,你只可以訪問某些許可的資源澈蟆,不許可的資源是拒絕被訪問的墨辛,于是就把Kernel和上層的應(yīng)用程序抽像的隔離開,分別稱之為Kernel Space和User Space趴俘。

簡單理解就是:
內(nèi)核空間可以執(zhí)行任意命令睹簇,調(diào)用系統(tǒng)的一切資源;
用戶空間只能執(zhí)行簡單的運算,不能直接調(diào)用系統(tǒng)資源寥闪;
那么用戶空間肯定會有想 調(diào)用系統(tǒng)資源 的需求太惠,比如應(yīng)用程序訪問文件的等。

根據(jù) Kernel Space Definition 這篇文字的詳細(xì)說明疲憋,我們可以得知:

Kernel space can be accessed by user processes only through the use of system calls.
只有通過使用系統(tǒng)調(diào)用凿渊,用戶進(jìn)程才能訪問內(nèi)核空間。

0.3 系統(tǒng)調(diào)用 / 內(nèi)核態(tài) / 用戶態(tài)

用戶空間訪問內(nèi)核空間的唯一方式就是 系統(tǒng)調(diào)用;通過這個統(tǒng)一入口接口埃脏,所有的資源訪問都是在內(nèi)核的控制下執(zhí)行搪锣,以免導(dǎo)致用戶程序?qū)ο到y(tǒng)資源的越權(quán)訪問,從而保障了系統(tǒng)的安全和穩(wěn)定彩掐。用戶軟件良莠不齊构舟,要是它們亂搞把系統(tǒng)玩壞了怎么辦?因此對于某些特權(quán)操作必須交給安全可靠的內(nèi)核來執(zhí)行堵幽。

當(dāng)一個任務(wù)(進(jìn)程)執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時狗超,我們就稱進(jìn)程處于內(nèi)核運行態(tài)(或簡稱為內(nèi)核態(tài))此時處理器處于特權(quán)級最高的(0級)內(nèi)核代碼中執(zhí)行。當(dāng)進(jìn)程在執(zhí)行用戶自己的代碼時朴下,則稱其處于用戶運行態(tài)(用戶態(tài))努咐。即此時處理器在特權(quán)級最低的(3級)用戶代碼中運行。處理器在特權(quán)等級高的時候才能執(zhí)行那些特權(quán)CPU指令殴胧。

0.4 內(nèi)存映射 之 mmap 方法

https://www.cnblogs.com/huxiao-tee/p/4660352.html#_label0
mmap 是 內(nèi)存映射文件 的一種方法麦撵。即將一個文件或者其它對象映射到進(jìn)程的地址空間。實現(xiàn)文件磁盤地址和進(jìn)程虛擬地址空間中一段虛擬地址的一一對應(yīng)關(guān)系溃肪。

Linux 內(nèi)核使用一個 vm_area_struct 結(jié)構(gòu)體來表示一個獨立的虛擬內(nèi)存區(qū)域免胃。
vm_area_struct 內(nèi)包含一個 vm_ops 指針,其內(nèi)部可引出所有針對這個區(qū)域可以使用的系統(tǒng)調(diào)用函數(shù)惫撰。
mmap 函數(shù)就是要創(chuàng)建一個新的 vm_area_struct 結(jié)構(gòu)體羔沙,并將其與文件的物理磁盤地址相連。

總而言之厨钻,常規(guī)文件操作需要從磁盤到頁緩存(處于內(nèi)核空間)再到用戶主存的兩次數(shù)據(jù)拷貝扼雏。而mmap操控文件,只需要從磁盤到用戶主存的一次數(shù)據(jù)拷貝過程夯膀。

具體的分析可查看如下文章

Gityuan Binder 系列
Binder 學(xué)習(xí)指南
Android 接口定義語言 (AIDL)
老羅的 Android 之旅
Android Bander設(shè)計與實現(xiàn) - 設(shè)計篇
相見恨晚 Binder 機(jī)制

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诗充,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诱建,更是在濱河造成了極大的恐慌蝴蜓,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俺猿,死亡現(xiàn)場離奇詭異茎匠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)押袍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門诵冒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谊惭,你說我怎么就攤上這事汽馋∥甓” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵豹芯,是天一觀的道長悄雅。 經(jīng)常有香客問我,道長告组,這世上最難降的妖魔是什么煤伟? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任癌佩,我火速辦了婚禮木缝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘围辙。我一直安慰自己我碟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布姚建。 她就那樣靜靜地躺著矫俺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掸冤。 梳的紋絲不亂的頭發(fā)上厘托,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音稿湿,去河邊找鬼铅匹。 笑死,一個胖子當(dāng)著我的面吹牛饺藤,可吹牛的內(nèi)容都是我干的包斑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼涕俗,長吁一口氣:“原來是場噩夢啊……” “哼罗丰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起再姑,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萌抵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后元镀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谜嫉,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年凹联,在試婚紗的時候發(fā)現(xiàn)自己被綠了沐兰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔽挠,死狀恐怖住闯,靈堂內(nèi)的尸體忽然破棺而出瓜浸,到底是詐尸還是另有隱情,我是刑警寧澤比原,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布插佛,位于F島的核電站,受9級特大地震影響量窘,放射性物質(zhì)發(fā)生泄漏雇寇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一蚌铜、第九天 我趴在偏房一處隱蔽的房頂上張望锨侯。 院中可真熱鬧,春花似錦冬殃、人聲如沸囚痴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽深滚。三九已至,卻和暖如春涣觉,著一層夾襖步出監(jiān)牢的瞬間痴荐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工官册, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留生兆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓攀隔,卻偏偏與公主長得像皂贩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昆汹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容