【问题标题】:memcpy takes virtual address or physical address?memcpy 采用虚拟地址还是物理地址?
【发布时间】:2016-03-12 12:53:50
【问题描述】:

我正在开发视频 HAL 应用程序,我正在从 HAL 层获取相机帧回调。在编程过程中,我发现 memcpy 从物理地址复制数据会崩溃,而通过从虚拟地址复制数据是可以的。我搜索了有关 memcpy 的此类信息,但在其手册页上找不到任何位置,甚至找不到。 所以,我的问题是 memcpy 需要物理地址还是虚拟地址?哪里有提到过这种关于 memcpy 的信息?

【问题讨论】:

  • 架构依赖。
  • memcpy 是用于用户空间程序的 C 库的一部分,它们不关心虚拟或物理地址。您必须检查您的操作系统内核文档以了解内核地址空间中的正确功能。
  • @MartinJames 这意味着我需要使用我的内核文档,对吧?
  • 投反对票有什么理由吗?

标签: c camera memcpy


【解决方案1】:

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

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

还要注意,在现代操作系统/内存架构中,每个进程都有自己的地址空间。在地址空间之间传递地址将不起作用。

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

【讨论】:

    【解决方案2】:

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

    然而,通过请求操作系统将一些目标虚拟地址重新映射为映射到源地址的物理内存的副本,具有非常特定对齐特征的非常大的区域有可能优化memcpy。这些页面将获得 COPY_ON_WRITE 属性,以确保程序只修改适当数组中的页面,如果以及何时写入其中一个。 GlibC 中memcpy通用 实现可以做到这一点(参见glibc-2.3.5/sysdeps/generic/memcpy.c)。但这对于仍然在用户空间提供地址的程序员来说是透明的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-04
      • 2013-05-05
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      相关资源
      最近更新 更多