[摘要]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++代码
-
-
-
int get_pmem_file(int fd, unsigned long *start, unsigned long *vstart,
-
unsigned long *len, struct file **filp)
-
{
-
struct file *file;
-
-
file = fget(fd);
-
if (unlikely(file == NULL)) {
-
printk(KERN_INFO "pmem: requested data from file descriptor "that doesn't exist.");
-
-
return -1;
-
}
-
-
if (get_pmem_addr(file, start, vstart, len))
-
goto end;
-
-
if (filp)
-
*filp = file;
-
return 0;
-
-
end:
-
fput(file);
-
return -1;
-
-
}
-
首先通过fget得到文件指针,然后调用get_pmem_addr。这里的文件指针为什么要在pmem里面调用不清楚。
复制到剪贴板 C/C++代码
-
int get_pmem_addr(struct file *file, unsigned long *start,
-
unsigned long *vstart, unsigned long *len)
-
{
-
struct pmem_data *data;
-
int id;
-
-
if (!is_pmem_file(file) || !has_allocation(file)) {
-
return -1;
-
}
-
-
data = (struct pmem_data *)file->private_data;
-
if (data->index == -1) {
-
#if PMEM_DEBUG
-
printk(KERN_INFO "pmem: requested pmem data from file with no "
-
"allocation.\n");
-
return -1;
-
#endif
-
}
-
id = get_id(file);
-
-
down_read(&data->sem);
-
*start = pmem_start_addr(id, data);
-
*len = pmem_len(id, data);
-
*vstart = (unsigned long)pmem_start_vaddr(id, data);
-
up_read(&data->sem);
-
#if PMEM_DEBUG
-
down_write(&data->sem);
-
data->ref++;
-
up_write(&data->sem);
-
#endif
-
return 0;
-
}
这个函数我们能看到分别调用了pmem_start_addr得到物理上的连续地址的首地址,pmem_len得到pmem的长度,pmem_start_vaddr得到虚拟地址。
这个函数我们知道了他的功能,就是通过PMEM得到物理地址和虚拟地址,还有buf的长度。这些干什么用那?嘻嘻,别忘了B2R2的功能啊!!--bit blit。这样我们知道了source 的buf也知道了destination的buffer 地址,我们就该copy了。
(责任编辑:)