memcpy采用虚拟地址还是物理地址?
我正在开发视频HAL应用程序&在那里我从HAL层得到了相机帧回调。在编程过程中,我发现memcpy从物理地址复制数据会崩溃,而从虚拟地址复制数据则可以。我搜索了有关memcpy的此类信息,但没有找到任何位置&甚至没有在其手册页上找到。memcpy采用虚拟地址还是物理地址?,c,camera,memcpy,C,Camera,Memcpy,我正在开发视频HAL应用程序&在那里我从HAL层得到了相机帧回调。在编程过程中,我发现memcpy从物理地址复制数据会崩溃,而从虚拟地址复制数据则可以。我搜索了有关memcpy的此类信息,但没有找到任何位置&甚至没有在其手册页上找到。 所以,我的问题是memcpy需要物理地址还是虚拟地址?任何地方提到过关于memcpy的此类信息吗?memcpy是用C实现的,或者是在汇编程序中优化的。因此,它不关心它得到什么类型的地址。它只是加载CPU寄存器中的地址并执行mov指令 操作系统和内存硬件体系结构负责
所以,我的问题是memcpy需要物理地址还是虚拟地址?任何地方提到过关于memcpy的此类信息吗?
memcpy
是用C实现的,或者是在汇编程序中优化的。因此,它不关心它得到什么类型的地址。它只是加载CPU寄存器中的地址并执行mov
指令
操作系统和内存硬件体系结构负责将任何逻辑(虚拟)地址映射到物理地址
还要注意,在现代OS/内存体系结构中,每个进程都有自己的地址空间。在地址空间之间传递地址将不起作用
在这些情况下,操作系统可能会提供在进程之间交换内存对象(共享或其他)的功能。
memcpy
是用C实现的,或者是在汇编程序中优化的。因此,它不关心它得到什么类型的地址。它只是加载CPU寄存器中的地址并执行mov
指令
操作系统和内存硬件体系结构负责将任何逻辑(虚拟)地址映射到物理地址
还要注意,在现代OS/内存体系结构中,每个进程都有自己的地址空间。在地址空间之间传递地址将不起作用
在这些情况下,操作系统可能会提供在进程之间交换内存对象(共享或其他)的功能。正如Paul Ogilvie正确解释的那样,
memcpy
处理用户空间地址。因此,它们是虚拟地址,不一定是物理地址
然而,通过请求操作系统将一些目标虚拟地址重新映射为映射到源地址的物理内存的副本,具有非常特定对齐特性的非常大的区域有可能优化
memcpy
。这些页面将获得COPY_ON_WRITE属性,以确保程序只修改相应数组中的页面(如果写入其中一个时)。GlibC中memcpy
的通用实现实现了这一点(请参见GlibC-2.3.5/sysdeps/generic/memcpy.c
)。但是对于仍然在用户空间中提供地址的程序员来说,这是透明的。正如Paul Ogilvie正确解释的那样,memcpy
处理用户空间地址。因此,它们是虚拟地址,不一定是物理地址
然而,通过请求操作系统将一些目标虚拟地址重新映射为映射到源地址的物理内存的副本,具有非常特定对齐特性的非常大的区域有可能优化
memcpy
。这些页面将获得COPY_ON_WRITE属性,以确保程序只修改相应数组中的页面(如果写入其中一个时)。GlibC中memcpy
的通用实现实现了这一点(请参见GlibC-2.3.5/sysdeps/generic/memcpy.c
)。但是对于仍然在用户空间中提供地址的程序员来说,这是透明的。依赖于体系结构。memcpy
是用户空间程序的C库的一部分,这些程序不关心虚拟或物理地址。您必须在内核地址空间中检查操作系统内核文档中是否有正确的函数。@这意味着我需要使用内核文档,对吗?是否有任何理由否决投票?取决于体系结构。memcpy
是用户空间程序C库的一部分,这些程序不关心虚拟地址或物理地址。您必须检查您的操作系统内核文档,以在内核地址空间中找到正确的函数。@MartinJames,这意味着我需要使用我的内核文档,对吗?有什么理由投反对票吗?