当前位置: 技术问答>linux和unix
关于V4L2驱动中V4L2_MEMORY_USERPTR的问题
来源: 互联网 发布时间:2016-10-10
本文导语: 在V4L2驱动中,有三种使用方式,其中的一种就是V4L2_MEMORY_USERPTR。V4L2_MEMORY_USERPTR表示使用用户空间内存。编程者在用户空间申请了内存后,可以通过这种方式,将该空间送到kernel空间使用。 我的问题是:在用户空间...
在V4L2驱动中,有三种使用方式,其中的一种就是V4L2_MEMORY_USERPTR。V4L2_MEMORY_USERPTR表示使用用户空间内存。编程者在用户空间申请了内存后,可以通过这种方式,将该空间送到kernel空间使用。
我的问题是:在用户空间申请的内存是逻辑空间,其物理上未必是连续的;而在kernel空间使用的内存应该是物理上连续,尤其是在kernel空间将该内存空间送给底层的硬件,比如视频编解码器使用(它们需要的是物理上连续的空间)。在这种情况下,用户空间的不连续空间如何与kernel里的要求的连续空间兼容的?用户空间的逻辑地址是如何转换成kernel空间的物理地址的?
望高手指点,谢谢了先。
我的问题是:在用户空间申请的内存是逻辑空间,其物理上未必是连续的;而在kernel空间使用的内存应该是物理上连续,尤其是在kernel空间将该内存空间送给底层的硬件,比如视频编解码器使用(它们需要的是物理上连续的空间)。在这种情况下,用户空间的不连续空间如何与kernel里的要求的连续空间兼容的?用户空间的逻辑地址是如何转换成kernel空间的物理地址的?
望高手指点,谢谢了先。
|
楼主,请注意几个概念:
在用户空间申请的内存是逻辑空间(注,是线性地址),其物理上未必是连续的;
而在kernel空间使用的内存应该是物理上连续(注,也不一定是连续的物理内存)。
逻辑地址(logical address):包含在机器语言指令中用来指定一个操作数或者一条指令的地址。即程序编译后形成的地址。
线性地址(linear address)或也叫虚拟地址(virtual address):
逻辑地址,经过MMU的分段单元的硬件电路转换后,形成线性地址,接着被子第二个称为分页单元的硬件电路把线性地址转换成物理地址。
物理地址(physical address):
用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。
参《ULK》第三版,page 40 to 41.
在用户空间申请的内存是逻辑空间(注,是线性地址),其物理上未必是连续的;
而在kernel空间使用的内存应该是物理上连续(注,也不一定是连续的物理内存)。
逻辑地址(logical address):包含在机器语言指令中用来指定一个操作数或者一条指令的地址。即程序编译后形成的地址。
线性地址(linear address)或也叫虚拟地址(virtual address):
逻辑地址,经过MMU的分段单元的硬件电路转换后,形成线性地址,接着被子第二个称为分页单元的硬件电路把线性地址转换成物理地址。
物理地址(physical address):
用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。
参《ULK》第三版,page 40 to 41.
|
举个例子:
char *p1 = (char *) malloc(sizeof(short)); /* 分配的heap memory物理上连续 */
char *p2 = *char *) malloc(1024 *10); /* 这10K heap meory极不可能在物理上连续,若以1个内存页以1K计算,即有10个内存页 */
而在kernel空间使用的内存应该是物理上连续(注,也不一定是连续的物理内存)。
举个例子:
kmalloc分配的内存在物理上是连续的;
vmalloc分配的内存在物理上可能不是连续的。
到底物理是否连续,依赖CPU的MMU(内存管理单元)的实现,以IA32体系为例,一般是段页式管理方式。
|
http://linux.chinaunix.net/bbs/thread-919019-1-7.html
这是CU上不错的文章,仅供参考!
这是CU上不错的文章,仅供参考!