android中匿名共享内存的核心函数

网友投稿 509 2022-05-29

android中匿名共享内存的核心函数

理论基础

Android系统在应用程序框架层中提供了两个C++类MemoryHeapBase和MemoryBase来创建和管理匿名共享内存。 如果一个进程需要与其他进程共享一块完整的匿名共享内存,那么就可以通过使用MemoryHeapBase类类创建这块匿名共享内存。如果一个进程创建一块匿名共享内存后,只希望与其他进程共享其中的一部分,那么就可以通过MemoryBase类来创建这块匿名共享内存。

IMemory.h:定义内存相关类的接口,表示堆内存的类IMemoryHeap和BnMemoryHeap,表示一般内存的类IMemory和BnMemory。 MemoryHeapBase.h:定义类MemoryHeapBase,继承并实现BnMemoryHeap MemoryBase.h:定义类MemoryBase,继承并实现BnMemory。

android系统在应用程序框架层中提供了java类MemoryFile来创建和管理匿名共享内存。使用java类MemoryFile创建的匿名共享内存可以在不同的Android应用程序之间进行共享。

java代码解析

匿名共享内存java类MemoryFile在系统中的source\frameworks\base\core\java\android\os\MemoryFile.java文件中实现。

//匿名共享内存的构造函数,参数1表示创建匿名共享内存的名称,参数2表示创建匿名共享内存大小 public MemoryFile(String name, int length) throws IOException { mLength = length; if (length >= 0) { //通过调用jni的接口去打开匿名共享内存 mFD = native_open(name, length); } else { throw new IOException("Invalid length: " + length); } if (length > 0) { //进行映射 mAddress = native_mmap(mFD, length, PROT_READ | PROT_WRITE); } else { mAddress = 0; } } 复制代码

C++关键函数解析

//MemoryHeapBase构造函数的实现 MemoryHeapBase::MemoryHeapBase(const char* device, size_t size, uint32_t flags) : mFD(-1), mSize(0), mBase(MAP_FAILED), mFlags(flags), mDevice(0), mNeedUnmap(false), mOffset(0) { int open_flags = O_RDWR; if (flags & NO_CACHING) open_flags |= O_SYNC; //通过调用open打开匿名共享内存设备文件 int fd = open(device, open_flags); ALOGE_IF(fd<0, "error opening %s: %s", device, strerror(errno)); if (fd >= 0) { //指定的匿名共享内存大小按页对齐 const size_t pagesize = getpagesize(); size = ((size + pagesize-1) & ~(pagesize-1)); //匿名共享内存映射到当前进程地址空间 if (mapfd(fd, size) == NO_ERROR) { mDevice = device; } } } 复制代码

//MemoryHeapBase构造函数 MemoryHeapBase::MemoryHeapBase(size_t size, uint32_t flags, char const * name) : mFD(-1), mSize(0), mBase(MAP_FAILED), mFlags(flags), mDevice(0), mNeedUnmap(false), mOffset(0) { //获得系统中页大小的内存 const size_t pagesize = getpagesize(); //内存页对齐 size = ((size + pagesize-1) & ~(pagesize-1)); //创建一块匿名共享内存 int fd = ashmem_create_region(name == NULL ? "MemoryHeapBase" : name, size); ALOGE_IF(fd<0, "error creating ashmem region: %s", strerror(errno)); if (fd >= 0) { //创建的匿名共享内存映射到当前进程地址空间中 if (mapfd(fd, size) == NO_ERROR) { if (flags & READ_ONLY) {//如果地址映射成功,修改匿名共享内存的访问属性 ashmem_set_prot_region(fd, PROT_READ); } } } }

Android 任务调度

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:什么是API文档?--斯科特·马文
下一篇:MongoDB修改,删除文档踩坑记!
相关文章