




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 簡單房屋租賃合同協(xié)議書
- 活動場地使用合同
- 城市建筑垃圾處理與資源化利用合作協(xié)議
- 高精度轉(zhuǎn)臺采購合同
- 建筑工程分包合同范本3
- 保險代理人委托代理合同
- 金融科技服務(wù)合作協(xié)議及數(shù)據(jù)保密免責(zé)條款
- 知識產(chǎn)權(quán)許可轉(zhuǎn)讓合同
- 個人數(shù)碼設(shè)備維修服務(wù)協(xié)議
- 多功能繪圖儀租賃合同
- 人教版四年級數(shù)學(xué)下冊《圖形的運動(二)》試題(含答案)
- 2024-2025學(xué)年五年級(下)信息科技教學(xué)計劃
- 《老年人權(quán)益保障法》
- 2025年交管12123駕駛證學(xué)法減分題庫與參考答案
- 2025下半年上海事業(yè)單位招考易考易錯模擬試題(共500題)試卷后附參考答案
- 天津市和平區(qū)2024-2025學(xué)年高一(上)期末質(zhì)量調(diào)查物理試卷(含解析)
- 《呼吸》系列油畫創(chuàng)作中詩意建構(gòu)的研究與實踐
- 客流統(tǒng)計系統(tǒng)施工方案
- 船舶制造設(shè)施安全生產(chǎn)培訓(xùn)
- 全國駕駛員考試(科目一)考試題庫下載1500道題(中英文對照版本)
- TSG 07-2019電梯安裝修理維護質(zhì)量保證手冊程序文件制度文件表單一整套
評論
0/150
提交評論