当前位置: 首页 > news >正文

学校网站制作素材最全bt搜索引擎入口

学校网站制作素材,最全bt搜索引擎入口,flash网站建设教程视频,宝塔搭建wordpress主机地址声明 其实对于Android系统的Ashmem匿名共享内存系统早就有分析的想法,记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾…文中参考了很多书籍及博客内容,可能涉及的比较…

声明

  • 其实对于Android系统的Ashmem匿名共享内存系统早就有分析的想法,记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾…
  • 文中参考了很多书籍及博客内容,可能涉及的比较多先不具体列出来了;
  • 本文使用的代码是LineageOS的cm-14.1,对应Android 7.1.2,可以参考我的另一篇博客:cm-14.1 Android系统启动过程分析(1)-如何下载Nexus5的LineageOS14.1(cm-14.1)系统源码并编译、刷机

实现共享的原理

  在Android系统中,每一块匿名共享内存都是使用一个文件描述符来描述的,而这个文件描述符是通过打开设备文件 /dev/ashmem 获得的。当两个进程需要共享一块匿名共享内存时,只要把它的文件描述符从一个进程传递给别外一个进程即可。
  但问题是在Linux系统中,文件描述符其实就是一个整数,它只在进程范围内有效,即值相等的两个文件描述符在两个不同的进程中具有不同的含义。在Linux内核中,每一个文件描述符都对应有一个文件结构体(struct file)。文件结构体是一个内核对象每一个打开的文件都有一个对应的文件结构体。文件描述符、文件结构体和文件的关系如图所示:
在这里插入图片描述
  不同的文件描述符可以对应于同一个文件结构体,而不同的文件结构体也可以对应于同一个文件。当应用程序调用函数 open 来打开一个文件时,文件系统就会为该文件创建一个文件结构体和一个文件描述符,最后将这个文件描述符返回给应用程序。
  由于应用程序打开设备文件 /dev/ashmem 时,Ashmem 驱动程序会为它在内核中创建一块匿名共享内存。因此,文件描述符、文件结构体和匿名共享内存的关系就如图所示:
在这里插入图片描述
  匿名共享内存能够在两个不同的进程中共享关键在于,这两个进程分别有一个文件描述符 fd1 和 fd2,它们指向了同一个文件结构体 file1,而这个文件结构体又指向了一块匿名共享内存 asma。这时候,如果这两个进程的文件描述符 fd1 和 fd2 分别被映射到各自的地址空间,那么它们就会把同一块匿名共享内存映射到各自的地址空间,从而实现在两个不同的进程中共享同一块匿名共享内存。

  问题:如何让两个位于不同进程中的文件描述符 fd1 和 fd2 指向同一个用来描述匿名共享内存 asma 的文件结构体file1呢?

  假设进程 p1 首先调用函数 open 来打开设备文件 /dev/ashmem,这样它就得到了一块匿名共享内存一个文件结构体 fle1 和一个文件描述符 fd1。然后进程 p2 通过 Binder 进程间通信机制请求进程 p1 将文件描述符 fd1 返回给它,进程 p1 要通过 Binder 驱动程序将文件描述符 fd1 返回给进程 p2。由于文件描述符 fd1 只在进程 p1 中有效,因此,Binder 驱动程序就不能直接将文件描述符 fd1 返回给进程 p2。这时候 Binder 驱动程序就会在进程 p2 中创建一个新的文件描述符 fd2,使得它也指向文件结构体 file1,最后再将文件描述符 fd2 返回给进程p2。这样,文件描述符 fd1 和 fd2 就指向同一个文件结构体 file1 了,即指向了同一块匿名共享内存 asma。

  Client组件通过其内部的一个 MemoryService 代理对象的成员函数 getFileDescriptor 来请求运行在另外一个进程中的 MemoryService 服务返回其内部的一块匿名共享内存的文件描述符这个过程如图所示:

Client IMemoryService.Stub.Proxy Binder Driver IMemoryService.Stub MemoryService 1. getFileDescriptor 2. transact 3. onTransact 4. getFileDescriptor 5. ParcelFileDescriptor 6. flat_binder_object 7. flat_binder_object 8. ParcelFileDescriptor Client IMemoryService.Stub.Proxy Binder Driver IMemoryService.Stub MemoryService

  第1步到第4步是 Client 组件请求 MemoryService 服务返回其内部的匿名共享内存的文件描述符的过程,而第5步到第8步是 MemoryService 服务返回其内部的匿名共享内存的文件描述符给 Client 组件的过程。
  第5步中,MemoryService 服务将内部的匿名共享内存的文件描述符封装成一个 ParcelFileDescriptor 对象,然后把它从 Java 层传输到 C++ 层。
  第6步时,这个正在传输的 ParcelFileDescriptor 对象首先被转换为一个类型为 BINDER_TYPE_FD 的 flat_binder_object 结构体,然后传输给 Binder 驱动程序。
  第7步时,Binder 驱动程序就会对第6步传输过来的 flat_binder_object 结构体进行处理,然后再在第8步返回给 Client 组件。

  Client 组件从 Binder 驱动程序中获得了 flat_binder_object 结构体之后,首先将它封装成一个 ParcelFileDescriptor 对象,然后再将它转换成一个 FileDescriptor 对象,最后就可以使用这个 FileDescriptor 对象来创建一个 MemoryFile 对象,即将 MemoryService 服务内部的匿名共享内存映射到 Client 组件所在的进程的地址空间,从而达到了在不同的进程中共享同一块匿名共享内存的目的。

http://www.tj-hxxt.cn/news/77519.html

相关文章:

  • 加拿大28怎么做网站代理什么是关键词举例说明
  • 做招聘网站需要人力资源许可商品标题优化
  • 论坛网站开发模板品牌营销服务
  • 营口市住房建设保障办官方网站重庆seo技术教程博客
  • 网站备案幕布大小外包网络推广营销
  • 成都网站建设 哪家比较好关键词收录查询工具
  • 怎么查找网站的服务器搜索引擎培训班
  • 上海做oocl船的公司网站百度网盘资源链接入口
  • 天空台108网站找手工活带回家做网站推广建设
  • 阿里云备案多个网站吗一份完整的电商运营方案
  • 广西手机响应式网站建设公司免费收录网站
  • 陕西建设招聘信息网站营销模式100个经典案例
  • 怎么做盗版网站赚钱seo排名关键词搜索结果
  • 怎样做网站检索数据分析手游推广加盟
  • 网站建设工作基本流程百度有几个总部
  • 网站托管西安百度官网app
  • 荥阳做网站推广小红书笔记关键词排名优化
  • 一家只做外卖的网站百度注册
  • 大众团购网站怎么做可以推广网站
  • 建立网站就是制作网页网站seo推广平台
  • 网站做qq链接seo是什么工作
  • 做网站的步骤 优帮云今日军事新闻头条
  • mega menu wordpress页面优化的方法
  • 石狮网站建设报价营销案例100例简短
  • 网站加速cdn自己做关键词推广排名软件
  • 做网站需要的硬件邀请注册推广赚钱的app
  • 百度自助网站建设seo站长工具推广平台
  • 集团网站建设 中企动力深圳网站建设微信开发
  • 临沂做网站哪里好长春网站建设解决方案
  • 网站内链案例宽带营销策略