问题标签 [memory-mapping]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
975 浏览

python - memory-mapping in python using numpy error

So I get the following error message when running this code... mmap.error: [Errno 22] Invalid argument. I really don't understand what I am doing wrong. I am running this in a Linux VM if that's relevant. Also, what's particularly curious is the matrix is created after the code runs, but it still crashes saying the argument is invalid which makes no sense as to why it would be creating the matrix when it says the argument is invalid.

Is there anything special I need to do to get memory mapping to work on a linux machine versus windows and mac? Because it is working fine on my mac and windows machine. I guess I should specify even more, is there some setting or something that needs to be set-up in a virtual machine to have memory mapping working? Because I tried it on a computer running Linux normally, and it worked.

0 投票
1 回答
748 浏览

c++ - C++ 中的内存映射、虚拟内存和物理内存

我正在尝试解决以下问题:拥有一个管理泛型类型的自定义数据容器,我需要允许其他应用程序组件检索容器的内部指针并将其用作简单的T*数组区域(不将其视为更智能的阵列支架)。问题是,在一个非常特殊的情况下,这个记忆被移到了其他地方并被删除了。因此,有大量组件知道旧数据指针并将使用该指针来访问它们所需的信息。

设置看起来像伪代码,如下所示:

假设:

T* ptr是一个映射在物理空间 A 中的伪地址(我可以称之为“虚拟”吗?)。

当事件发生时,T* ptr将为另一个物理空间 B 设置 的映射。

任何使用T* ptr的组件都不会注意到物理位置的变化,“认为”它的数据存储在那个虚拟地址上。

结论:

因此,我想知道是否存在一种涉及内存映射(虚拟到物理)的机制,该机制将允许处理 的映射T* ptr,从而使其他应用程序组件保持不变。简单地说,T* ptr应该指向在某个部分被映射的内存区域,并且根据请求,相同的指针将被映射到另一个地方(为了一致性而复制底层数据的地方)。这必须允许无缝过渡。

注意:我不能使用包装器、智能指针、句柄等,因为这意味着修改一个巨大的代码库只是为了一个相当小的修改。

由于我没有找到足够的资源来处理这种情况,也许任何人都可以提供一个简短的网络介绍,其中包含一些关于该主题的相关阅读材料?

0 投票
3 回答
3785 浏览

c++ - 将 QFile 内容复制到另一个 QFile,最佳方法是什么?

我需要将 a 分块复制QFile到另一个QFile,所以我不能使用QFile::copy. 这是最原始的实现:

从这个片段中不清楚,但我只打算将一个二进制文件作为一个整体复制到另一个位置,只是以块的形式,这样我就可以为大文件提供进度回调和取消工具。

另一个想法是使用内存映射。我是不是该?如果是这样,那么我应该只映射源文件并仍然使用_destFile.write,还是应该同时映射并使用memcpy

我想这个问题与 Qt 并没有真正的联系,我认为答案应该适用于任何支持内存映射的文件 I/O API。

0 投票
1 回答
538 浏览

fpga - 如何将 Xilinx-FPGA Virtex5/7 的内存用作映射到 x86-CPU 地址空间的内存?

是否可以将 Xilinx-FPGA Virtex5/7 的内存用作映射到 Intel x86_64-CPU 内存的虚拟和/或物理地址空间的内存以及如何操作?

最大程度地,我需要使用统一的单一地址空间,并具有从 CPU 到 FPGA 的内存的直接内存访问 (DMA)(就像对 CPU-RAM 的简单内存访问)。

  • CPU:x86_64 英特尔酷睿 i7
  • 操作系统:Linux 内核 2.6
  • 接口连接:PCI-Express 2.0 8x
0 投票
2 回答
480 浏览

memory - ARM内存映射:INT15等效?查询内存映射的标准方法?

PC 架构上(BIOS 的存在和使用非常标准化),您可以通过使用INT15 BIOS 中断函数来发现 RAM 内存的大小,以及它的保留/免费使用区域,函数0xE820

由于我对低级编程充满热情,并且在对英特尔架构进行了大约 6 个月的编程后,我决定尝试了解其他架构的工作原理。所以我开始深入研究 ARM 开发。我目前正在开发 2 块板:Olimex A20 OlinuXino-MICROSamsung Arndale 的 Exynos 5250。我要做的是将我为英特尔架构开发的管理程序移植到这两个板上。我现在正处于尝试以可靠可接受的标准化方式以编程方式检测系统的内存映射的阶段方式(我不希望为不同的 ARM 板编写完全不同的代码)。但到目前为止,我发现相关文档有点混乱。

在 Olimex A20 上,我有一个 Cortex-A7 ARM CPU。在此处找到的 PDF:http: //infocenter.arm.com/help/topic/com.arm.doc.den0001c/DEN0001C_principles_of_arm_memory_maps.pdf适用于 Cortex-A7 和其他 CPU,在第 14 页指出内存寻址空间从 1GB 到 2GB是为内存映射 I/O 设备保留的,而在此链接中找到的 Olimex-A20 文档https://github.com/OLIMEX/OLINUXINO/blob/master/HARDWARE/A20-PDFs/A20 %20User%20Manual%202013-03-22.pdf?raw=true第 21 页指出从 1GB 到 3GB 的内存寻址空间是DDR-II/DDR-III 内存

我只是感到困惑还是这两个文件之间存在不一致?

0 投票
2 回答
2221 浏览

linux-kernel - CPU如何知道PCI地址空间

我了解 CPU 可以配置 PCI 和 PCIe 设备(通过 BIOS 或操作系统中的代码),通过写入设备配置空间的特定区域来响应某些物理内存地址。
事实上,考虑到设备的许多要求(内存对齐、DMA 功能等),Linux 内核具有相当复杂的算法来执行此操作。

看到该软件似乎可以控制该内存是否映射、何时以及在何处映射,我的问题是:一个软件如何控制物理内存的映射?

在这个配置之后,PCI 设备将知道响应给定的地址范围,但是 CPU 怎么知道它应该在 PCI 总线上为那些刚刚动态决定的特定地址?

0 投票
1 回答
4347 浏览

cuda - nVidia RDMA GPUDirect 是否总是只操作物理地址(在 CPU 的物理地址空间中)?

我们知道:http ://en.wikipedia.org/wiki/IOMMU#Advantages

IOMMU可以支持外设内存分页。使用 PCI-SIG PCIe 地址转换服务 (ATS) 页面请求接口 (PRI) 扩展的外围设备可以检测并发出对内存管理器服务的需求。

在此处输入图像描述

但是当我们使用 CUDA >= 5.0 的 nVidia GPU 时,我们可以使用 RDMA GPUDirect,并且知道:

http://docs.nvidia.com/cuda/gpudirect-rdma/index.html#how-gpudirect-rdma-works

传统上,像 BAR 窗口这样的资源使用 CPU 的 MMU 作为内存映射 I/O (MMIO) 地址映射到用户或内核地址空间。但是,由于当前的操作系统没有足够的机制在驱动程序之间交换 MMIO 区域,因此 NVIDIA 内核驱动程序导出函数来执行必要的地址转换和映射。

http://docs.nvidia.com/cuda/gpudirect-rdma/index.html#supported-systems

从 PCI 设备的角度来看,GPUDirect 的 RDMA 目前依赖于所有物理地址相同。这使得它与 IOMMU 不兼容,因此必须禁用 RDMA 才能使 GPUDirect 工作。

如果我们将 CPU-RAM 分配并映射到 UVA,如下所示:

我们在 Windwos7x64 中得到相等的指针,这意味着cudaHostGetDevicePointer()什么都不做:

host_src_ptr = 68719476736

uva_src_ptr = 68719476736

“在驱动程序之间交换 MMIO 区域的足够机制”是什么意思,这里的机制是什么意思,以及为什么我不能通过使用虚拟地址通过 PCIe 访问 BAR 的物理区域来使用 IOMMU - 通过 PCIe 的另一个内存映射设备?

这是否意味着 RDMA GPUDirect 始终只操作物理地址(在 CPU 的物理地址空间中),但是为什么我们向内核函数发送uva_src_ptr等于host_src_ptr- CPU 虚拟地址空间中的简单指针?

0 投票
2 回答
1107 浏览

c - 在 Infiniband 中,PCIe-BAR、Infiniband 卡的内部缓冲区或远程计算机的 RAM 中的映射是什么?

众所周知,Infiniband 允许 RDMA - 直接访问远程计算机的内存。

众所周知,PCI-Express(端点)设备,包括 PCIe 卡 Infiniband,能够以两种方式进行通信:

  • IO 端口(输入/输出) 已弃用
  • MMIO(BAR - 内存映射 IO:mov)

但是 BAR (MMIO) 中究竟显示了什么?(使用 PCIe 卡 Infiniband 时):

  • 它自己的内部缓冲存储卡 Infiniband?
  • 远程计算机的 RAM 的一部分(目前正在使用 RDMA 复制数据的 RAM 部分)?

当我使用 Infiniband 时,PCIe-BAR、Infiniband 卡的内部缓冲区或远程计算机的 RAM 中的映射是什么?

0 投票
1 回答
648 浏览

c - 多个客户端的posix共享内存

我正在使用 POSIX 共享内存和未命名的信号量来实现客户端服务器。服务器应同时处理多个客户端。该代码适用于单个客户端,但不适用于多个客户端。POSIX 操作通过以下方式进行管理,

问题是,要处理多个客户端,是否需要维护一个 Comm 结构的数组;那Comm[max_clients]不是我目前使用的(单个 Comm 结构)?对于每个客户端,服务器需要管理 Comm 数组并将该数组中合适的元素返回给客户端。反过来,客户端将使用该块来同步 Comm 元素中信号量上的操作?还是可以使用单个 Comm 结构处理多个客户端?

0 投票
0 回答
170 浏览

java - 在java中减小内存映射文件的大小

在内存中映射大小为 X 的文件后,我无法减小文件大小。

最初:

该过程完成后,您需要调整文件大小。不幸的是,没有办法使 java 取消映射,并调整文件大小(小于初始大小)它会生成异常。

我试图“删除”映射并强制垃圾收集器,但它也会产生异常(但并非总是如此)。

在 java 中对内存映射文件进行低压缩的建议?谢谢。