分享到:

西安雁塔兆隆计算机培训中心西安软件开发,西安java培训,全国领先的软件开发培训

联系资料

西安雁塔兆隆计算机培训中心
所在地区:
陕西省 西安市
公司主页:
暂无
电话号码:
029-*******
传真号码:
暂无
联 系 人:
王老师
移动电话:
1592*******
电子邮箱:
暂无

北大青鸟西安兆隆:Android Pmem

发布于:2012年12月31日 来源:www.szfuhai.com
[摘要]Pmem是Android系统里面的内存管理。PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。我们的Display和B2R2需要连续的内存区域。所以我们和PMEM打交道会很多的。 我们看到resolve_buf的函数。这个函数是为了解析B2R2传

Pmem是系统里面的内存管理。PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。我们的Display和B2R2需要连续的内存区域。所以我们和PMEM打交道会很多的。

 

       我们看到resolve_buf的函数。这个函数是为了解析B2R2传送过来的2D加速的blt buffer。有关这方面的东西我们在B2R2里面分析。在这里面我们看到了有关pmem的函数:get_pmem_file,我们就先从这里入手。插入pmem的世界里。

复制到剪贴板  C/C++代码
  1.          
  2.   
  3. int get_pmem_file(int fd, unsigned long *start, unsigned long *vstart,   
  4.     unsigned long *len, struct file **filp)   
  5. {   
  6.        struct file *file;   
  7.   
  8. file = fget(fd);   
  9.        if (unlikely(file == NULL)) {   
  10.               printk(KERN_INFO "pmem: requested data from file descriptor "that doesn't exist.");   
  11.   
  12. return -1;   
  13.        }   
  14.   
  15. if (get_pmem_addr(file, start, vstart, len))   
  16.        goto end;   
  17.   
  18. if (filp)   
  19.        *filp = file;   
  20.  return 0;   
  21.   
  22. end:   
  23.        fput(file);   
  24.  return -1;   
  25.   
  26. }   
  27.   

首先通过fget得到文件指针,然后调用get_pmem_addr。这里的文件指针为什么要在pmem里面调用不清楚。
 

复制到剪贴板  C/C++代码
  1. int get_pmem_addr(struct file *file, unsigned long *start,   
  2.                 unsigned long *vstart, unsigned long *len)   
  3. {   
  4.        struct pmem_data *data;   
  5.        int id;   
  6.     
  7.        if (!is_pmem_file(file) || !has_allocation(file)) {   
  8.               return -1;   
  9.        }   
  10.     
  11.        data = (struct pmem_data *)file->private_data;   
  12.        if (data->index == -1) {   
  13. #if PMEM_DEBUG   
  14.               printk(KERN_INFO "pmem: requested pmem data from file with no "  
  15.                      "allocation.\n");   
  16.               return -1;   
  17. #endif   
  18.        }   
  19.        id = get_id(file);   
  20.     
  21.        down_read(&data->sem);   
  22.        *start = pmem_start_addr(id, data);   
  23.        *len = pmem_len(id, data);   
  24.        *vstart = (unsigned long)pmem_start_vaddr(id, data);   
  25.        up_read(&data->sem);   
  26. #if PMEM_DEBUG   
  27.        down_write(&data->sem);   
  28.        data->ref++;   
  29.        up_write(&data->sem);   
  30. #endif   
  31.        return 0;   
  32. }   

 

 

这个函数我们能看到分别调用了pmem_start_addr得到物理上的连续地址的首地址,pmem_len得到pmem的长度,pmem_start_vaddr得到虚拟地址。
 
这个函数我们知道了他的功能,就是通过PMEM得到物理地址和虚拟地址,还有buf的长度。这些干什么用那?嘻嘻,别忘了B2R2的功能啊!!--bit blit。这样我们知道了source 的buf也知道了destination的buffer 地址,我们就该copy了。

(责任编辑:)