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

宁德市蕉城区建设局网站天津建设厅网站

宁德市蕉城区建设局网站,天津建设厅网站,天眼网查询个人信息,关于公司网站建设方案收集声明 其实对于Android系统的Ashmem匿名共享内存系统早就有分析的想法#xff0c;记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的#xff0c;但因为我个人问题没能实施这个计划#xff0c;留下些许遗憾…文中参考了很多书籍及博客内容#xff0c;可能涉及的比较…声明 其实对于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 服务返回其内部的一块匿名共享内存的文件描述符这个过程如图所示 #mermaid-svg-erlRIQCKLFqQHYnx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-erlRIQCKLFqQHYnx .error-icon{fill:#552222;}#mermaid-svg-erlRIQCKLFqQHYnx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-erlRIQCKLFqQHYnx .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-erlRIQCKLFqQHYnx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-erlRIQCKLFqQHYnx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-erlRIQCKLFqQHYnx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-erlRIQCKLFqQHYnx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-erlRIQCKLFqQHYnx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-erlRIQCKLFqQHYnx .marker.cross{stroke:#333333;}#mermaid-svg-erlRIQCKLFqQHYnx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-erlRIQCKLFqQHYnx .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-erlRIQCKLFqQHYnx text.actortspan{fill:black;stroke:none;}#mermaid-svg-erlRIQCKLFqQHYnx .actor-line{stroke:grey;}#mermaid-svg-erlRIQCKLFqQHYnx .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-erlRIQCKLFqQHYnx .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-erlRIQCKLFqQHYnx #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-erlRIQCKLFqQHYnx .sequenceNumber{fill:white;}#mermaid-svg-erlRIQCKLFqQHYnx #sequencenumber{fill:#333;}#mermaid-svg-erlRIQCKLFqQHYnx #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-erlRIQCKLFqQHYnx .messageText{fill:#333;stroke:#333;}#mermaid-svg-erlRIQCKLFqQHYnx .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-erlRIQCKLFqQHYnx .labelText,#mermaid-svg-erlRIQCKLFqQHYnx .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-erlRIQCKLFqQHYnx .loopText,#mermaid-svg-erlRIQCKLFqQHYnx .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-erlRIQCKLFqQHYnx .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-erlRIQCKLFqQHYnx .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-erlRIQCKLFqQHYnx .noteText,#mermaid-svg-erlRIQCKLFqQHYnx .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-erlRIQCKLFqQHYnx .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-erlRIQCKLFqQHYnx .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-erlRIQCKLFqQHYnx .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-erlRIQCKLFqQHYnx .actorPopupMenu{position:absolute;}#mermaid-svg-erlRIQCKLFqQHYnx .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-erlRIQCKLFqQHYnx .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-erlRIQCKLFqQHYnx .actor-man circle,#mermaid-svg-erlRIQCKLFqQHYnx line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-erlRIQCKLFqQHYnx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 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.hkea.cn/news/14449372/

相关文章:

  • 哪个网站做恒生指数最安全php 网站开发心得
  • 做网站需要哪些东西和步骤安阳市网站制作公司
  • 网站建设价格报价上海建设银行官网网站
  • 苏州外贸网站建设公司排名自己买一个服务器怎么做网站
  • 企业网站 流程襄阳seo顾问
  • 长沙公司网站设计报价公关公司有哪些职位
  • 五矿瑞和上海建设有限公司网站网站开发 加密存储 解密 二次计算
  • 论坛网站太难做没人全新的手机网站设计
  • 内容网站 如何做采集三水住房和城乡建设局的网站
  • 建设网站有什么原则如何运营一个公众号
  • 做测算的网站静态网站可以申请域名吗
  • 在自己的网站做外链主页模板
  • 网站的建设与维护工资广东建设工程注册中心网站
  • 南宁做自适应网站建筑公司名称大全
  • 网站建设改版北京计算机编程培训学校
  • 网站建设必须要备案吗网站设计一般要求
  • 移动端网站设计前有哪些准备工作?外贸网站建设培训
  • 网站优化排名易下拉霸屏南阳做网站价格
  • vs2010网站开发源码驻马店河南网站建设
  • 友点企业网站管理系统模板下载找人做网站怎么找
  • 如何查看网站的空间商百度联系方式
  • 定制网站哪家好wordpress列表页怎么加关键词
  • 百度为什么不收录网站的某个版块崇州市微信端网站建
  • 动易网站模板免费哪些网站是python做的
  • 最新备案网站查询wordpress acf使用
  • 常州网站建设公司如何百度ai人工智能平台
  • 软件技术适合女生学吗什么是seo和sem
  • 网站建设经典案例上海网站建设021360
  • 附近做app的公司做优化需要发多少个网站
  • 网站建设广州哪家好广告制作包括范围