铝合金窗什么品牌好:pmem杂记

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 06:19:30

froyo:

drivers/misc/pmem.c

frameworks/base/libs/binder:

 

这是一个简单的使用:

pmem_fd = open("/dev/pmem_adsp", O_RDWR, 0);//打开设备,为了操作硬件引擎,要noncache的
ioctl(pmem_fd, PMEM_GET_TOTAL_SIZE, ®ion)  //获取全部空间

pmem_base = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);//mmap操作

ioctl(pmem_fd, PMEM_GET_PHYS, ®ion) //获取物理地址

munmap

 

考虑使用PMEM_CONNECT的话,有
1。 multiple references with multiple allocations

fd0 = open("/dev/pmem_xxx", ...)

mmap();

...

fd1 = open("/dev/pmem_xxx", ...)

mmap();

 

2。 multiple references with one allocation in oneprocess or one process group

 

fd0 = open("/dev/pmem_xxx", ...)

mmap();

...

 

fd1 = open("/dev/pmem_xxx", ...);

ret = ioctl(fd1, PMEM_CONNECT, fd0);

if (ret != 0) goto error;

struct pmem_region region1 = { offset1, size1 };

ret = ioctl(fd1, PMEM_MAP, ®ion1);

...

 

3. multiple references with one allocation inmultiple processes

a think it's a little tricky 

 

 

 

MemoryHeapBase

MemoryHeapBase :BnMemoryHeap

 

MemoryHeapPmem :MemoryHeapBase

MemoryHeapPmem ::MemoryPmem :BnMemory :BnInterface

 

 

 

view plainprint?

  1.        struct pmem_region region;  
  2. sp base = new MemoryHeapBase(PMEM_DEVICE,  
  3.     mPreviewFrameSize_align * (kPreviewBufCnt));  
  4. if (base->heapID() < 0) {  
  5.     LOGE("Failed to allocate pmem from %s", PMEM_DEVICE);  
  6. }  
  7. mPreviewHeap = new MemoryHeapPmem(base, 0);  
  8. int fd_pmem = mPreviewHeap->getHeapID();  
  9. if (ioctl(fd_pmem, PMEM_GET_PHYS, ®ion)) {  
  10.     LOGE("%s: Failed to get PMEM physical address", __FUNCTION__);  
  11. }  
  12.   
  13.       /* 
  14.        * Make an IMemory for each streaming buffer so that we can reuse 
  15.        * them in callbacks. 
  16.        */  
  17.       for (int i = 0; i < kPreviewBufCnt; i++) {  
  18.           mBuffers[i] = (static_cast(mPreviewHeap.get()))->  
  19.               mapMemory(i * mPreviewFrameSize_align, mPreviewFrameSize);  
  20.           mBufferPhyAddr[i] = (void *)(region.offset +  
  21.                                        i * mPreviewFrameSize_align);  
  22.       }