Android PMEM驱动研究 在应用程序中使用PMEM
2010-05-14 16:52:00 来源:WEB开发网size = 4<<20; // 4 MiB
}
else
{
size = region.len;
}
pmem_base = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);//mmap操作
if (pmem_base == MAP_FAILED)
{
pmem_base = 0;
close(pmem_fd);
pmem_fd = -1;
printf("mmap pmem error! ");
}
if ( ioctl(pmem_fd, PMEM_GET_PHYS, ®ion) < 0)//获取物理地址
{
printf("PMEM_GET_PHYS failed ");
}
}
其实第一个ioctl无用,只是为了获取长度,也可以自己指定长度。
经过以上操作,region.offset为物理地址,其空间和虚拟地址pmem_base相对应。
在程序中填充pmem_base数据,配置VPU、GPU时使用region.offset该物理地址。
=======================================================================================
最后来看看驱动调用流程
1)open操作
[drivers/misc/pmem.c:pmem_open:336] current 55 file c7355c80(1)
2)mmap 会自动调用allocate
[drivers/misc/pmem.c:pmem_allocate:398] order 0
[drivers/misc/pmem.c:pmem_map_pfn_range:511] map offset 0 len 10000
3)ioctl PMEM_GET_PHYS 感觉物理地址是根据pid来确定的
[drivers/misc/pmem.c:pmem_ioctl:1081] get_phys
pmem: request for physical address of pmem region from process 55.
4)munmap
[drivers/misc/pmem.c:pmem_vma_close:555] current 55 ppid 47 file c7355c80 count 2
更多精彩
赞助商链接