在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++接口提供基础。

更多相关文章

  1. 专项测试(三)内存泄漏调试经验分享 (一)
  2. Android的内存泄露测试 mat
  3. Android中native进程内存泄露的调试技巧
  4. Android(安卓)内存管理机制
  5. Android(安卓)内存优化
  6. Android中App可分配内存的大小
  7. Android(安卓)Weak Handler:可以避免内存泄漏的Handler库
  8. Android需要大量内存时自己设置堆大小
  9. 腾讯优测优分享 | Android性能测试工具化实现

随机推荐

  1. 如何优雅的统计代码耗时
  2. Flink JDBC Connector:Flink 与数据库集成
  3. 华为认证HCIA】适合网工小白看懂的超详细
  4. 【SpringCloud】配置:application.yml中都
  5. 【华为认证HCIA】小白入门必看的VRRP协议
  6. 【深受启发篇】如何快速成为一个优秀的网
  7. 【网工收藏必备】从原理到配置,路由重发你
  8. 【网工必备】华为设备网络基础配置命令总
  9. 以一个ser2net软件包为例解读openwrt19.0
  10. 小技巧:SpringBoot项目如何让前端开发提高