




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 在前面一篇文章Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析中,我们系统地介绍了Android系统匿名共享内存的实现原理,其中着重介绍了它是如何辅助内存管理系统来有效地管理内存的,在再前面一篇文章Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划中,我们还提到,Android系统匿名共享内存的另外一特点是通过Binder进程间通信机制来实现进程间共享的,本文中,将详细介绍Android系统匿名共享内存是如何使用Bind
2、er进程间通信机制来实现进程间共享的。 由于Android系统匿名共享内存在进程间共享的原理涉及到Binder进程间通信机制的相关知识,所以希望读者在继续阅读本文之前,最好对Android系统的Binder进程间通信机制有一定的了解,具体可以参考Android进程间通信(IPC)机制Binder简要介绍和学习计划这篇文章。 在Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划这篇文章中,我们举了一个例子来简要
3、地介绍了Android系统的匿名共享内存机制及其使用方法,在这篇文章中,我们继续以这个实例来说明Android系统的匿名共享内存是如何使用Binder进程间通信机制来实现进程间共享的。为了方便描述,结合前面的Binder进程间通信机制知识,我们通过下面这个序列图来总结这个实例中的匿名共享内存文件的文件描述符在进程间传输的过程: 这里, 我们需要关注的便是虚线框部分了,它在Binder驱动程序中实现了在两个进程中共享同一个打开文件的方法。我们知道,在Linux系统中,文件描述符其实就是一个整数。每一个进程在内核空间都有一个打开文件的
4、数组,这个文件描述符的整数值就是用来索引这个数组的,而且,这个文件描述符只是在本进程内有效,也就是说,在不同的进程中,相同的文件描述符的值,代表的可能是不同的打开文件。因此,在进程间传输文件描述符时,不能简要地把一个文件描述符从一个进程传给另外一个进程,中间必须做一过转换,使得这个文件描述在目标进程中是有效的,并且它和源进程的文件描述符所对应的打开文件是一致的,这样才能保证共享。 在浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路一文中,我们介绍了用来传输的Binder对象的数据
5、结构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了,要传输的文件描述符的值保存在handle域中。 在Android系统进程间通信(IPC)
15、机制Binder中的Server启动过程源代码分析一文中,我们详细介绍了Binder对象在进程间通信传输的完整过程,这里就不再详述了,有兴趣的读都可以回过头去参考一下。这里,我们只关注文件描述符类型的Binder对象在Binder驱动程序中的相关处理逻辑。 文件描述符类型的Binder对象在Binder驱动程序中的相关处理逻辑实现在binder_transact函数,这个函数定义在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系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划这篇文章中所举的例子获取匿名共享内存文件的文件描述符的场景。匿名共享内存文件是在Server进程创建的,Client通过IMemoryService.getFileDescriptor去获取Server进程所创建的匿名共享内存文件的文件描述符,Server进程在返回
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年监理工程师建设工程合同管理专项练习
- 2025建筑工程合同书(空白)+安全责任
- 2025年高速公路工程合同管理研究
- 工厂合伙加盟协议书
- 购房佣金协议书范本
- 2025年03月江苏泰州市海陵区事业单位公开招聘工作人员44人笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 广西钦州市浦北县2025年高三第一次质量检查试题历史试题含解析
- 江苏省盐城市郭猛实验学校2025届初三5月模拟英语试题含答案
- 广西经济职业学院《药品分析》2023-2024学年第二学期期末试卷
- 贵州理工学院《生物分子学及检验》2023-2024学年第二学期期末试卷
- 零星维修工程 投标方案(技术方案)
- 2024年人力资源行业变革:人工智能在招聘中的应用
- 2024-2030年中国玩偶行业发展前景预测及竞争力策略分析报告
- 【初中物理】《质量》教学课件-2024-2025学年人教版(2024)八年级物理上册
- 全电路欧姆定律-完整课件
- 《数据的收集》课件
- DBJ33T 1320-2024 建设工程质量检测技术管理标准
- 腰椎骨折健康宣教
- GB/T 23862-2024文物包装与运输规范
- 九年级化学上册(沪教版2024)新教材解读课件
- 2024届四川省自贡市富顺县数学三下期末统考试题含解析
评论
0/150
提交评论