Android - Ashmem驱动

news/2024/5/16 21:35:48

以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):
http://blog.csdn.net/luoshengyang/article/details/8923485
http://blog.csdn.net/luoshengyang/article/details/12957169

 整理by Doing
 
匿名共享内存子系统Ashmem(Anonymous Shared Memory):
          主体是 以驱动程序的形式实现在内核空间 的,同时,在系统运行时库层和应用程序框架层提供了访问接口,其中, 在系统运行时库层提供了C/C++调用接口 ,而 在应用程序框架层提供了Java调用接口 应用程序框架层的Java调用接口是通过JNI方法来调用系统运行时库层的C/C++调用接口,最后进入到内核空间的Ashmem驱动程序去。
          我们在这里举一个例子:一个名为Ashmem的应用程序,它包含了一个Server端和一个Client端实现,其中,Server端是以Service的形式实现的,在这里Service里面,创建一个匿名共享内存文件,而Client是一个Activity,这个Activity通过Binder进程间通信机制获得前面这个Service创建的匿名共享内存文件的句柄,从而实现共享。在Android应用程序框架层,提供了一个MemoryFile接口来封装了匿名共享内存文件的创建和使用,它实现在frameworks/base/core/java/android/os/MemoryFile.java文件中。Server端是通过MemoryFile类来创建匿名共享内存文件,Client获得这个匿名共享内存文件的句柄
 
匿名共享内存子系统Ashmem:
  • 能够辅助Linux内核的内存管理系统来有效地管理不再使用的内存块
    Ashmem驱动程序实现:创建(open)、映射(mmap)、读写(read/write)以及锁定和解锁(pin/unpin)
    Ashmem驱动程序不提供read和write文件操作,进程若要访问这个共享内存,必须要把这个设备文件映射到自己的进程空间中,然后进行直接内存访问。MemoryFile的匿名共享内存读写操作都是通过JNI方法来实现的,读操作和写操作的JNI方法分别是native_read和native_write。
  • 通过Binder进程间通信机制来实现进程间的内存共享:
    在Linux系统中,文件描述符其实就是一个整数,它是用来索引进程保存在内核空间的打开文件数据结构的,而且,这个文件描述符只是在进程内有效,也就是说,在不同的进程中,相同的文件描述符的值,代表的可能是不同的打开文件,既然是这样,把Server进程中的文件描述符传给Client进程,似乎就没有用了,但是不用担心,在传输过程中, Binder驱动程序会帮我们处理好一切, 保证Client进程拿到的文件描述符是在本进程中有效的,并且它指向就是Server进程创建的匿名共享内存文件
     可以通过Binder IPC在进程间进行传递和共享 – flat_binder_object(BINDER_TYPE_FD)。
     Binder驱动对类型 BINDER_TYPE_FD  的Binder对象(flat_binder_object)的 处理:
  1. 在源进程中找到对应的struct file结构体
  2. 将上述struct file结构体 保存在目标进程的打开文件列表中
  3. 构造一个类型为BINDER_TYPE_FD的flat_binder_object
  4. 将上述flat_binder_object发送给目标进程
 
 
Ashmem进程间共享原理-- 文件、文件结构体、文件描述符的关系:
 
Ashmem进程间共享原理-- 两个在不同进程中的文件描述符对应同一个指向设备文件/dev/ashmem的文件结构体:

 
句柄(handle)
    在程序设计中,句柄(handle)是一种特殊的智能指针。当一个应用程序要引用 其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。        句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制 (封装) 。通俗的说就是我们调用句柄就是调用句柄所提供的服务,即句柄已经把它能做的操作都设定好了,我们只能在句柄所提供的操作范围内进行操作,但是普通指针的操作却多种多样,不受限制。
 
文件描述符:
    文件描述符在形式上是一个 非负整数。实际上,它是一个 索引值指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。(在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。)
 



转载于:https://www.cnblogs.com/Doing-what-I-love/p/5530263.html


http://www.niftyadmin.cn/n/4051107.html

相关文章

requireJs和r.js压缩工具

上面release是执行命令 node r.js -o build.js 生成的&#xff0c;需要切换到目录require/tools下面&#xff0c;也就是 有r.js和build.js的目录&#xff0c;才能执行命令 代码目录如上&#xff1a; main.html代码如下&#xff1a; <!DOCTYPE html> <html><head…

遥感卫星快视设备的设计与实现

遥感卫星快视设备的设计与实现 作者&#xff1a;孙磊, 安建平, 卜祥元 遥感卫星在进行地面信源测试时&#xff0c;需要对测试信源进行高速持续大容量记录&#xff0c;以达到测试卫星信源的目的。在一些诸如雷达信号处理、图像通信、高速A/D数据采集等通信和测量领域&#xff0c…

u盘无法格式化怎么办?数据丢失这样恢复

u盘无法格式化怎么办&#xff1f;u盘是大家常用到的一款存储工具&#xff0c;但经常使用也会造成u盘损坏&#xff0c;常见的问题就是u盘无法格式化&#xff0c;这种情况下我们该如何解决呢&#xff1f;数据是否还能恢复呢&#xff1f;下面就一起来了解下u盘修复的方法。 u盘无法…

美化select的jquery插件

自己写的一个美化select插件&#xff0c;浏览器自带的实在太丑&#xff0c;还不能用css自定义。 插件主要原理是隐藏原生的select控件&#xff0c;支持select上设置change事件。 脚本 1 /*2 * iSelect 3 * 自定义select控件4 */5 (function ($) {6 $.fn.iSelect function …

SUSE linux 使用LVM安装系统和管理

引出 在我们安装好linux系统后会发现在需要修改磁盘分区的时候会比较困难,系统安装的/目录的文件系统要更改基本不太可能&#xff0c;其他目录如/home目录也比较困难。但是系统安装时要是采用的LVM管理的方式安装的话就会截然不通。 一、首先普及下LVM的基础知识 LVM&#xff0…

第十二节,运算符

1算数运算 运算符 描述 示例 加&#xff0c;两个对象相加 ab输出结果30 - 减&#xff0c;得到负数&#xff0c;或者一个数减去另一个数 a-b输出结果-10 * 乘&#xff0c;两个数相乘或是返回一个被重复若干次的字符串 a*b输出结果200 / 除&#xf…

hiho_1058_combination_lock

题目大意 给定N个字符&#xff0c;范围为A-Z&#xff0c;编号为1-N&#xff0c;对该字符序列进行M个操作&#xff0c;操作有4中类型&#xff1a; &#xff08;1&#xff09;CMD 1 i j X 将[i, j]区间内的字符均变为X &#xff08;2&#xff09;CMD 2 i j K 将[i, j]区间…

团队项目:第二次冲刺站立会议02

团队项目&#xff1a;第二次冲刺站立会议02 一.昨天干了什么搜集各银行业务的相关资料&#xff0c;注意事项。二.今天准备干什么整理关于银行业务的相关资料&#xff0c;列出所要内容。三.遇到的困难整理资料没什么困难。转载于:https://www.cnblogs.com/kongyuhang/p/5538607.…