在Android
匿名共享内存驱动源码分析中详细分析了匿名共享内存在Linux内核空间的实现,虽然内核空间实现了匿名共享内存,但仍然需要在用户空间为用户使用匿名共享内存提供访问接口。Android系统在用户空间,C++应用程序框架层,Java层分别提供了访问接口
本文首先介绍匿名共享内存在用户空间提供的C语言接口,在后续文章中在介绍Android匿名共享内存的C++及Java接口,从而全面理解并掌握Android匿名共享内存的使用。
1)匿名共享内存的创建
system\core\libcutils\ashmem-dev.c
int ashmem_create_region(const char *name, size_t size)
{
int fd, ret;
//打开"/dev/ashmem"设备文件
fd = open(ASHMEM_DEVICE, O_RDWR);
if (fd < 0)
return fd;
//根据Java空间传过来的名称修改设备文件名
if (name) {
char buf[ASHMEM_NAME_LEN];
strlcpy(buf, name, sizeof(buf));
//进入匿名共享内存驱动修改匿名共享内存名称
ret = ioctl(fd, ASHMEM_SET_NAME, buf);
if (ret < 0)
goto error;
}
////进入匿名共享内存驱动修改匿名共享内存大小
ret = ioctl(fd, ASHMEM_SET_SIZE, size);
if (ret < 0)
goto error;
return fd;
error:
close(fd);
return ret;
}
ASHMEM_DEVICE的宏定义如下:
#define ASHMEM_DEVICE "/dev/ashmem"
函数ashmem_create_region首先通过open函数进入匿名共享内存驱动打开/dev/ashmem设备文件,打开过程在
Android
匿名共享内存驱动源码分析中已经详细分析了,就是在匿名共享内存初始化过程创建的slab缓冲区ashmem_area_cachep中创建并初始化一个ashmem_area结构体了,接着通过IO命令来修改该ashmem_area结构体的成员name和size,具体设置过程请查看
Android
匿名共享内存驱动源码分析。匿名共享内存的创建过程可以归纳为以下三个步骤:
1.打开/dev/ashmem设备文件;
2. 修改匿名共享内存名称
3. 修改匿名共享内存大小
2)设置匿名共享内存属性
通过Ioctl命令控制系统调用进入内核空间的匿名共享内存驱动来设置匿名共享内存块的属性值,比如设置匿名共享内存块的锁定与解锁,设置匿名共享内存块的大小,名称,保护位等属性信息。Android对匿名共享内存的这些属性访问也提供了相应的C语言接口:
1. 设置匿名共享内存的保护位
int ashmem_set_prot_region(int fd, int prot)
{
return ioctl(fd, ASHMEM_SET_PROT_MASK, prot);
}
2.锁定匿名共享内存块
int ashmem_pin_region(int fd, size_t offset, size_t len)
{
struct ashmem_pin pin = { offset, len };
return ioctl(fd, ASHMEM_PIN, &pin);
}
3.解锁指定匿名共享内存块
int ashmem_unpin_region(int fd, size_t offset, size_t len)
{
struct ashmem_pin pin = { offset, len };
return ioctl(fd, ASHMEM_UNPIN, &pin);
}
4.获取创建的匿名共享内存大小
int ashmem_get_size_region(int fd)
{
return ioctl(fd, ASHMEM_GET_SIZE, NULL);
}
无论是匿名共享内存的属性设置还是获取,都是直接使用ioctl系统调用进入匿名共享内存驱动中实现的,关于匿名共享内存驱动是如何实现这些功能的,在
Android
匿名共享内存驱动源码分析中有详细的介绍,这里就不重复介绍了。这里我们知道Android提供的匿名共享内存C语言接口比较简单。了解了匿名共享内存的C语言接口之后也为以后学习匿名共享内存的C++接口提供基础。
分享到:
相关推荐
Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析
Android调用C++实现共享内存,利用Binder进行跨进程通信。博客地址:https://blog.csdn.net/liny000/article/details/83717727
6.2 运行时库cutils的匿名共享内存访问接口 6.3 匿名共享内存的C++访问接口 6.3.1 MemoryHeapBase 6.3.2 MemoryBase 6.3.3 应用实例 6.4 匿名共享内存的Java访问接口 6.4.1 MemoryFile 6.4.2 应用...
android系统分析内存泄露测试android系统分析内存泄露测试android系统分析内存泄露测试
android binder c++ 代码实现,添加内存共享、读写通知通过binder通行。代码再Android 9上测试无问题。
Android应用程序内存泄漏的分析.pdf
用AndroidStudio内存泄漏分析,亲测可用,在项目中充分验证。
6.2 运行时库cutils的匿名共享内存访问接口 6.3 匿名共享内存的C++访问接口 6.3.1 MemoryHeapBase 6.3.2 MemoryBase 6.3.3 应用实例 6.4 匿名共享内存的Java访问接口 6.4.1 MemoryFile 6.4.2 应用实例 6.5 ...
Android 内存泄露原因分析。通过原因分析,再接合代码可查明具体原因,发现对策
Android 内存泄露 Mat工具分析。非常好的分析工具讲解
本资源,利用hidl接口规范,写了一个共享内存的服务,简单明了,用到了IAllocator、native_handle_t等等等标准方法
Android 基于共享内存实现 Camera 跨进程大数据的高效传输.zip
Binder与Ashm 为什么将Binder与Ashm匿名共享内存放在开头,因为Binder与Ashm是...Android提供了匿名共享内存的C运行库访问接口(但NDK不能使用),Java层也有访问接口,就是MemoryFile.java,通过研究MemoryFile可以
主要介绍了android调用C语言实现内存的读取与修改的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要从5个模块入手: 1 java的GC机制以及Android最大堆内存分配 2 Monitors 3 DDMS/Traceview 4 Mat 5 LeakCanary 6 开发中要注意的点。
简单接口回调demo。
匿名共享内存分析的也很好。 情况分析应该是学毛德操老师的,作者确实做到了,作者在讲解时,会从java层到native层,再到linux kernel中整个串起来讲。使读者可以完全了解某些子系统的运行机制 内容简介 · · · ...
Android专用驱动系统篇介绍了Logger日志驱动程序、Binder进程间通信驱动程序以及Ashmem匿名共享内存驱动程序;Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。...
Android专用驱动系统篇介绍了Logger日志驱动程序、Binder进程间通信驱动程序以及Ashmem匿名共享内存驱动程序;Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。 ...
Unity调用Android查看内存信息,在android上面运行时候可查看fps,系统内存大小,系统可用内存大小,当前App占用内存