无码人妻精一区二区三区,eeuss影院www在线观看,无码精品久久久久久人妻中字,日韩av高清在线看片

推薦新聞
App開發(fā)的朋友注意啦,Binder基礎(chǔ)原理詳解!
發(fā)布者:深藍(lán)互聯(lián)
發(fā)布時(shí)間:2019-11-08
點(diǎn)擊:次

基本概念介紹


這里我們先從 Linux 中進(jìn)程間通信涉及的一些基本概念開始介紹,然后逐步展開,向大家說明傳統(tǒng)的進(jìn)程間通信的原理。
 

Linux 背景知識(shí)

上圖展示了 Liunx 中跨進(jìn)程通信涉及到的一些基本概念:

  • 進(jìn)程空間劃分:用戶空間(User Space)/內(nèi)核空間(Kernel Space)
  • 進(jìn)程隔離
  • 系統(tǒng)調(diào)用:用戶態(tài)/內(nèi)核態(tài)

1.1 進(jìn)程空間劃分

一個(gè)進(jìn)程空間分為 用戶空間 & 內(nèi)核空間(Kernel),即把進(jìn)程內(nèi) 用戶 & 內(nèi)核 隔離開來

二者區(qū)別:

進(jìn)程間,用戶空間的數(shù)據(jù)不可共享,所以用戶空間 = 不可共享空間

進(jìn)程間,內(nèi)核空間的數(shù)據(jù)可共享,所以內(nèi)核空間 = 可共享空間

所有進(jìn)程共用1個(gè)內(nèi)核空間

進(jìn)程內(nèi) 用戶空間 & 內(nèi)核空間 進(jìn)行交互 需通過 系統(tǒng)調(diào)用,主要通過函數(shù):

copy_from_user():將用戶空間的數(shù)據(jù)拷貝到內(nèi)核空間

copy_to_user():將內(nèi)核空間的數(shù)據(jù)拷貝到用戶空間

 

1.2 進(jìn)程隔離 & 跨進(jìn)程通信( IPC )

進(jìn)程隔離

為了保證 安全性 & 獨(dú)立性,一個(gè)進(jìn)程 不能直接操作或者訪問另一個(gè)進(jìn)程,即Android的進(jìn)程是相互獨(dú)立、隔離的

跨進(jìn)程通信( IPC )

即進(jìn)程間需進(jìn)行數(shù)據(jù)交互、通信

跨進(jìn)程通信的基本原理

a. 而Binder的作用則是:連接 兩個(gè)進(jìn)程,實(shí)現(xiàn)了mmap()系統(tǒng)調(diào)用,主要負(fù)責(zé) 創(chuàng)建數(shù)據(jù)接收的緩存空間 & 管理數(shù)據(jù)接收緩存

b. 注:傳統(tǒng)的跨進(jìn)程通信需拷貝數(shù)據(jù)2次,但Binder機(jī)制只需1次,主要是使用到了內(nèi)存映射,具體下面會(huì)詳細(xì)說明

1.3 系統(tǒng)調(diào)用:用戶態(tài)與內(nèi)核態(tài)
雖然從邏輯上進(jìn)行了用戶空間和內(nèi)核空間的劃分,但不可避免的用戶空間需要訪問內(nèi)核源,比如文件操作、訪問網(wǎng)絡(luò)等等。為了突破隔離限制,就需要借助系統(tǒng)調(diào)用來實(shí)現(xiàn)。系統(tǒng)調(diào)用是用戶空間訪問內(nèi)核空間的唯一方式,保證了所有的資源訪問都是在內(nèi)核的控制下進(jìn)行的,避免了用戶程序?qū)ο到y(tǒng)資源的越權(quán)訪問,提升了系統(tǒng)安全性和穩(wěn)定性。

Linux 使用兩級(jí)保護(hù)機(jī)制:0 級(jí)供系統(tǒng)內(nèi)核使用,3 級(jí)供用戶程序使用。

當(dāng)一個(gè)任務(wù)(進(jìn)程)執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時(shí),稱進(jìn)程處于內(nèi)核運(yùn)行態(tài)(內(nèi)核態(tài))。此時(shí)處理器處于特權(quán)級(jí)最高的(0級(jí))內(nèi)核代碼中執(zhí)行。當(dāng)進(jìn)程處于內(nèi)核態(tài)時(shí),執(zhí)行的內(nèi)核代碼會(huì)使用當(dāng)前進(jìn)程的內(nèi)核棧。每個(gè)進(jìn)程都有自己的內(nèi)核棧。

當(dāng)進(jìn)程在執(zhí)行用戶自己的代碼的時(shí)候,我們稱其處于用戶運(yùn)行態(tài)(用戶態(tài))。此時(shí)處理器在特權(quán)級(jí)最低的(3級(jí))用戶代碼中運(yùn)行。

系統(tǒng)調(diào)用主要通過如下兩個(gè)函數(shù)來實(shí)現(xiàn):copy_from_user() //將數(shù)據(jù)從用戶空間拷貝到內(nèi)核空間 copy_to_user() //將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間

1.4 內(nèi)存映射

由于應(yīng)用程序不能直接操作設(shè)備硬件地址,所以操作系統(tǒng)提供了一種機(jī)制:內(nèi)存映射,把設(shè)備地址映射到進(jìn)程虛擬內(nèi)存區(qū)。

舉個(gè)例子,如果用戶空間需要讀取磁盤的文件,如果不采用內(nèi)存映射,那么就需要在內(nèi)核空間建立一個(gè)頁(yè)緩存,頁(yè)緩存去拷貝磁盤上的文件,然后用戶空間拷貝頁(yè)緩存的文件,這就需要兩次拷貝。

采用內(nèi)存映射,如下圖所示。

由于新建了虛擬內(nèi)存區(qū)域,那么磁盤文件和虛擬內(nèi)存區(qū)域就可以直接映射,少了一次拷貝。

內(nèi)存映射全名為Memory Map,在Linux中通過系統(tǒng)調(diào)用函數(shù)mmap來實(shí)現(xiàn)內(nèi)存映射。將用戶空間的一塊內(nèi)存區(qū)域映射到內(nèi)核空間。映射關(guān)系建立后,用戶對(duì)這塊內(nèi)存區(qū)域的修改可以直接反應(yīng)到內(nèi)核空間,反之亦然。內(nèi)存映射能減少數(shù)據(jù)拷貝次數(shù),實(shí)現(xiàn)用戶空間和內(nèi)核空間的高效互動(dòng)。

 

關(guān)注深藍(lán)互聯(lián)公眾號(hào)
Copyright ? 2013-2025 深藍(lán)互聯(lián) 版權(quán)所有
友情鏈接: