Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)在進程間_第1頁
Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)在進程間_第2頁
Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)在進程間_第3頁
Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)在進程間_第4頁
Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)在進程間_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、       在前面一篇文章Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)驅(qū)動程序源代碼分析中,我們系統(tǒng)地介紹了Android系統(tǒng)匿名共享內(nèi)存的實現(xiàn)原理,其中著重介紹了它是如何輔助內(nèi)存管理系統(tǒng)來有效地管理內(nèi)存的,在再前面一篇文章Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)簡要介紹和學(xué)習(xí)計劃中,我們還提到,Android系統(tǒng)匿名共享內(nèi)存的另外一特點是通過Binder進程間通信機制來實現(xiàn)進程間共享的,本文中,將詳細介紹Android系統(tǒng)匿名共享內(nèi)存是如何使用Bind

2、er進程間通信機制來實現(xiàn)進程間共享的。        由于Android系統(tǒng)匿名共享內(nèi)存在進程間共享的原理涉及到Binder進程間通信機制的相關(guān)知識,所以希望讀者在繼續(xù)閱讀本文之前,最好對Android系統(tǒng)的Binder進程間通信機制有一定的了解,具體可以參考Android進程間通信(IPC)機制Binder簡要介紹和學(xué)習(xí)計劃這篇文章。        在Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)簡要介紹和學(xué)習(xí)計劃這篇文章中,我們舉了一個例子來簡要

3、地介紹了Android系統(tǒng)的匿名共享內(nèi)存機制及其使用方法,在這篇文章中,我們繼續(xù)以這個實例來說明Android系統(tǒng)的匿名共享內(nèi)存是如何使用Binder進程間通信機制來實現(xiàn)進程間共享的。為了方便描述,結(jié)合前面的Binder進程間通信機制知識,我們通過下面這個序列圖來總結(jié)這個實例中的匿名共享內(nèi)存文件的文件描述符在進程間傳輸?shù)倪^程:        這里, 我們需要關(guān)注的便是虛線框部分了,它在Binder驅(qū)動程序中實現(xiàn)了在兩個進程中共享同一個打開文件的方法。我們知道,在Linux系統(tǒng)中,文件描述符其實就是一個整數(shù)。每一個進程在內(nèi)核空間都有一個打開文件的

4、數(shù)組,這個文件描述符的整數(shù)值就是用來索引這個數(shù)組的,而且,這個文件描述符只是在本進程內(nèi)有效,也就是說,在不同的進程中,相同的文件描述符的值,代表的可能是不同的打開文件。因此,在進程間傳輸文件描述符時,不能簡要地把一個文件描述符從一個進程傳給另外一個進程,中間必須做一過轉(zhuǎn)換,使得這個文件描述在目標進程中是有效的,并且它和源進程的文件描述符所對應(yīng)的打開文件是一致的,這樣才能保證共享。        在淺談Service Manager成為Android進程間通信(IPC)機制Binder守護進程之路一文中,我們介紹了用來傳輸?shù)腂inder對象的數(shù)據(jù)

5、結(jié)構(gòu)struct flat_binder_object,它定義在kernel/common/drivers/staging/android/binder.h 文件中:view plain1. /* 2.  * This is the flattened representation of a Binder object for transfer 3.  * between processes.  The&#

6、160;'offsets' supplied as part of a binder transaction 4.  * contains offsets into the data where these structures occur.  The Binder 5.  * driver takes care 

7、;of re-writing the structure type and data as it moves 6.  * between processes. 7.  */  8. struct flat_binder_object   9.     /* 8 bytes for large_flat_hea

8、der. */  10.     unsigned long       type;  11.     unsigned long       flags;  12.   13.     /* 8 bytes&

9、#160;of data. */  14.     union   15.         void        *binder;    /* local object */  16.     &#

10、160;   signed long handle;     /* remote object */  17.       18.   19.     /* extra data associated with local object */ 

11、60;20.     void            *cookie;  21. ;          域type是一個枚舉類型,它的取值范圍是:view plain1. enum   2.     BINDER_TYPE_BINDER  = B_P

12、ACK_CHARS('s', 'b', '*', B_TYPE_LARGE),  3.     BINDER_TYPE_WEAK_BINDER = B_PACK_CHARS('w', 'b', '*', B_TYPE_LARGE),  4.     BINDER_TYPE_HANDLE 

13、60;= B_PACK_CHARS('s', 'h', '*', B_TYPE_LARGE),  5.     BINDER_TYPE_WEAK_HANDLE = B_PACK_CHARS('w', 'h', '*', B_TYPE_LARGE),  6.     BINDER_TYPE_FD

14、      = B_PACK_CHARS('f', 'd', '*', B_TYPE_LARGE),  7. ;          這里我們要介紹的Binder對象的type便是BINDER_TYPE_FD了,要傳輸?shù)奈募枋龇闹当4嬖趆andle域中。        在Android系統(tǒng)進程間通信(IPC)

15、機制Binder中的Server啟動過程源代碼分析一文中,我們詳細介紹了Binder對象在進程間通信傳輸?shù)耐暾^程,這里就不再詳述了,有興趣的讀都可以回過頭去參考一下。這里,我們只關(guān)注文件描述符類型的Binder對象在Binder驅(qū)動程序中的相關(guān)處理邏輯。        文件描述符類型的Binder對象在Binder驅(qū)動程序中的相關(guān)處理邏輯實現(xiàn)在binder_transact函數(shù),這個函數(shù)定義在kernel/common/drivers/staging/android/binder.c文件中:view plain1. static v

16、oid  2. binder_transaction(struct binder_proc *proc, struct binder_thread *thread,  3. struct binder_transaction_data *tr, int reply)  4.   5.     struct binder_transaction *t; 

17、60;6.     struct binder_work *tcomplete;  7.     size_t *offp, *off_end;  8.     struct binder_proc *target_proc;  9.     struct binder_thread *target

18、_thread = NULL;  10.     struct binder_node *target_node = NULL;  11.     struct list_head *target_list;  12.     wait_queue_head_t *target_wait;  13. 

19、0;   struct binder_transaction *in_reply_to = NULL;  14.     struct binder_transaction_log_entry *e;  15.     uint32_t return_error;  16.   17.     .&

20、#160; 18.       19.   20.     offp = (size_t *)(t->buffer->data + ALIGN(tr->data_size, sizeof(void *);  21.   22.     .  23.   24.

21、    off_end = (void *)offp + tr->offsets_size;  25.     for (; offp < off_end; offp+)   26.         struct flat_binder_object *fp

22、;  27.         .  28.         fp = (struct flat_binder_object *)(t->buffer->data + *offp);  29.         switch

23、0;(fp->type)   30.         .  31.         case BINDER_TYPE_FD:   32.             int target_fd;  

24、33.             struct file *file;  34.   35.             if (reply)   36.          &

25、#160;      if (!(in_reply_to->flags & TF_ACCEPT_FDS)   37.                     binder_user_error("binder: %d:%d got

26、60;reply with fd, %ld, but target does not allow fdsn",  38.                               

27、;      proc->pid, thread->pid, fp->handle);  39.                     return_error = BR_FAILED_REPLY;  40.   

28、60;                 goto err_fd_not_allowed;  41.                   42.       &#

29、160;      else if (!target_node->accept_fds)   43.                 binder_user_error("binder: %d:%d got transaction with fd, %l

30、d, but target does not allow fdsn",  44.                                 proc->pid, thr

31、ead->pid, fp->handle);  45.                 return_error = BR_FAILED_REPLY;  46.                 go

32、to err_fd_not_allowed;  47.               48.   49.             file = fget(fp->handle);  50.     

33、0;       if (file = NULL)   51.                 binder_user_error("binder: %d:%d got transaction with invalid fd, %

34、ldn",  52.                                     proc->pid, thread->pid, fp->handle);

35、60; 53.                 return_error = BR_FAILED_REPLY;  54.                 goto err_fget_failed;  

36、55.               56.             target_fd = task_get_unused_fd_flags(target_proc, O_CLOEXEC);  57.        &#

37、160;    if (target_fd < 0)   58.                 fput(file);  59.                &

38、#160;return_error = BR_FAILED_REPLY;  60.                 goto err_get_unused_fd_failed;  61.               62. 

39、60;           task_fd_install(target_proc, target_fd, file);  63.             if (binder_debug_mask & BINDER_DEBUG_TRANSACTION)  64. 

40、60;                   printk(KERN_INFO "        fd %ld -> %dn", fp->handle, target_fd);  65.   

41、0;         /* TODO: fput? */  66.             fp->handle = target_fd;  67.          break;  

42、68.   69.         .  70.           71.       72.       73.     .  74.   75.           這里,我們先明確一下在Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)簡要介紹和學(xué)習(xí)計劃這篇文章中所舉的例子獲取匿名共享內(nèi)存文件的文件描述符的場景。匿名共享內(nèi)存文件是在Server進程創(chuàng)建的,Client通過IMemoryService.getFileDescriptor去獲取Server進程所創(chuàng)建的匿名共享內(nèi)存文件的文件描述符,Server進程在返回

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論