[摘要]Pmem是Android系統里面的內存管理。PMEM用于向用戶空間提供連續的物理內存區域,DSP和某些設備只能工作在連續的物理內存上。我們的Display和B2R2需要連續的內存區域。所以我們和PMEM打交道會很多的。 我們看到resolve_buf的函數。這個函數是為了解析B2R2傳
Pmem是系(xi)統里面的(de)(de)內存(cun)(cun)管理。PMEM用(yong)于向(xiang)用(yong)戶空間提供連續的(de)(de)物理內存(cun)(cun)區域(yu),DSP和(he)某些設備只能工(gong)作在連續的(de)(de)物理內存(cun)(cun)上(shang)。我們(men)的(de)(de)Display和(he)B2R2需要連續的(de)(de)內存(cun)(cun)區域(yu)。所(suo)以我們(men)和(he)PMEM打(da)交道會很多的(de)(de)。
我們看(kan)到(dao)resolve_buf的函數(shu)。這個函數(shu)是為了(le)解析(xi)B2R2傳送過來的2D加速的blt buffer。有(you)關這方面(mian)的東西(xi)我們在(zai)B2R2里面(mian)分析(xi)。在(zai)這里面(mian)我們看(kan)到(dao)了(le)有(you)關pmem的函數(shu):get_pmem_file,我們就先(xian)從(cong)這里入(ru)(ru)手。插入(ru)(ru)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得到虛擬地址。
這(zhe)個函數我們(men)知道(dao)了(le)他的(de)(de)功能,就是(shi)通(tong)過PMEM得到物理地址和虛擬(ni)地址,還有buf的(de)(de)長度(du)。這(zhe)些(xie)干什么用(yong)那(nei)?嘻(xi)嘻(xi),別忘(wang)了(le)B2R2的(de)(de)功能啊(a)!!--bit blit。這(zhe)樣(yang)我們(men)知道(dao)了(le)source 的(de)(de)buf也知道(dao)了(le)destination的(de)(de)buffer 地址,我們(men)就該copy了(le)。
(責(ze)任(ren)編輯:)