memcpy需要虚拟地址或物理地址?

时间:2016-03-12 12:53:51

标签: c camera memcpy

我正在开发视频HAL应用程序&在那里我从HAL Layer获得Camera frame CallBack。在编程期间,我发现通过从虚拟地址复制数据,从物理地址复制数据的memcpy会崩溃。我搜索了关于memcpy的这些信息,但没有找到&甚至不在其手册页上。 所以,我的问题是memcpy需要物理地址还是虚拟地址?在哪里提到了关于memcpy的这类信息?

2 个答案:

答案 0 :(得分:2)

memcpy在C中实现或在汇编程序中进行优化。因此,它并不关心它获得什么类型的地址。它只是加载CPU寄存器中的地址并执行mov指令。

操作系统和内存硬件架构负责将任何逻辑(虚拟)地址映射到物理地址。

另请注意,对于现代OS /内存架构,每个进程都有自己的地址空间。在地址空间之间传递地址将不起作用。

在这些情况下,操作系统可能会提供在进程之间交换内存对象(共享或其他)的功能。

答案 1 :(得分:0)

正如Paul Ogilvie正确解释的那样,memcpy处理用户空间地址。因此,它们是虚拟地址,不一定是物理地址。

然而,通过请求OS将某些目标虚拟地址重新映射为映射到源地址的物理内存的副本,非常大的区域具有非常特定的对齐特性,以优化memcpy。这些页面将获得COPY_ON_WRITE属性,以确保程序仅在写入任何一个页面时修改相应数组中的页面。 GlibC中memcpy泛型实现(见glibc-2.3.5/sysdeps/generic/memcpy.c)。但对于仍在用户空间中提供地址的程序员来说,这是透明的。