问题标签 [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 投票
1 回答
2001 浏览

c# - 启用写入映射到内存的文件

当该文件真正在互联网上时,我想使用内存映射文件来虚拟化在 Windows 上打开文件。

所以我将内存映射文件创建为:

我可以在 Windows 上读取它,但不能保存它:

在此处输入图像描述

请注意我是如何打开文件的(同时数据在内存而不是硬盘上),但是当我尝试保存更改时我无法打开。所以我的问题是:我如何能够保存对该文件的更改,而只是更改内存映射文件的内存中的内容,而不实际尝试将任何内容保存到磁盘。

0 投票
1 回答
886 浏览

c - Linux下共享内存映射

动机

我想编写一对程序,其中一个程序读取数据并将其转换为内部格式,另一个程序将内部格式转换为其他格式。作为练习,我想在不使用管道的情况下编写这些程序之间的交互。我更喜欢使用信号和共享内存。

我想要的是

我有 A 调用 B 的程序 A 和 B。我该怎么做

  1. 从程序 A 创建一个内存块
  2. 从程序 A 调用程序 B,给它关于在哪里找到内存块的信息
  3. 使用两个程序中的内存块。

更具体地说,A 解码自定义视频格式并将单个未压缩帧放入共享缓冲区。B 从缓冲区中读取数据并将其编码为输出流。解码器每秒解码高达 100 帧,这大约是 500 MiB/s 的内存流量。管道变得很慢,因为必须经常复制数据并且缓冲区不是很大。

我认为可能有效

我的想法是用来mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)创建一段共享内存。问题是,execve(2)状态手册页:

不保留内存映射 (mmap(2))。

那么,我怎样才能与其他程序共享该内存呢?将这两种功能都放在一个程序中并改用是更好的主意fork吗?

0 投票
0 回答
1213 浏览

linux - 为 Linux 2.6.30 DMA API 映射设备内存

我一直在努力解决这个问题,非常感谢一些帮助。我想使用 At91sam9g45 的内部 SRAM(垫脚石 - 启动后不使用)来加快一些密集计算,但无法满足以下所有条件:

  1. 内存可以从用户空间访问。这很容易使用 user spacemmap()然后 kernel remap_pfn_range()。使用返回的指针,我的用户空间程序可以读取/写入 SRAM。

  2. 使用内核 DMA API 调用dma_async_memcpy_buf_to_buf()使用 DMA 执行 memcpy。在我的基本驱动程序中,我想调用此操作将数据从 DDR(使用 kmalloc() 分配)复制到 SRAM 缓冲区中。

所以我的问题是我有用户空间和物理地址,但没有内核空间 DMA API 友好映射。

我尝试使用 ioremap 并使用提供给iotable_init(). 这些似乎都不会导致内核虚拟地址可以与类似的东西一起使用virt_to_bus(它适用于 kmalloc 地址,我认为在 DMA API 中使用)。

有办法,这只是使用物理地址手动触发 DMA,但我想尝试解决这个问题。我一直在阅读 LDD3 和谷歌搜索,但我看不到任何将非 kmalloc 内存用于 DMA API 的示例(PCI 总线除外)。

0 投票
1 回答
3902 浏览

windows - Minifilter 驱动程序、内存映射和记事本

我将从我的最终目标开始。我希望我系统上的每个文档(doc、docx、pdf、txt 等)都有一个固定的(并且对用户来说是透明的)标题。例如,字符串“abcde”将被添加到每个文档中。

为此,我编写了一个微过滤驱动程序,它执行以下操作:

IRP_MJ_WRITE- 如果标题存在,则将偏移量更改为文件的开头。

IRP_MJ_READ- 如果标题存在,则将偏移量更改为文件的开头。

IRP_MJ_QUERY_INFORMATION- 如果标题存在,则更改返回的文件大小。

IRP_MJ_DIRECTORY_CONTROL- 如果标题存在,则更改返回的文件大小。

IRP_MJ_CREATE- 如果标题不存在,则将标题添加到文件中。

这很好用,除了 MS Word 2003 文档(doc、xls、ppt)和记事本。我似乎没有捕捉到一些读写操作,记事本显示了标题和文件。

我在http://www.osronline.com/上阅读了很多内容,并且每个提出要求的人都被告知要阅读一些 Nagar 书籍或查看他们的档案(搜索起来是灾难)。我想我已经阅读了与我的问题相关的所有内容。

似乎记事本使用了内存映射文件、快速 IO、分页 IO,天知道还有什么。我尝试过使用 mHook和hook NtMapViewOfSection,但是当我在记事本中打开一些文件并试图找到映射的数据时,我没有运气(但我找到了映射到内存的所有其他字节)。MapViewOfFileMapViewOfFileEx

然后我读到我想要完成的事情是不可能用钩子完成的,只有使用微过滤器驱动程序,并且从我认为我缺少一些要设置的标志。

如果有人能告诉我该怎么做才能捕捉记事本的操作,我真的会很感激。

这是一些阅读代码示例:

IsFileNeedProccessing检查文件名和请求进程。(某些应用程序可以看到标题)

如果有人能告诉我该怎么做才能捕捉记事本的操作,我真的会很感激。

谢谢。

0 投票
1 回答
13174 浏览

c++ - 将内存映射的数据块读入结构

我今天一直在 VC++ 2008 上玩内存映射,但我仍然没有完全理解如何使用它,或者它是否适合我的目的。我的目标是快速读取一个非常大的二进制文件。

我有一个结构:

它被多次写入文件。“条目”变量是浮点小数数组。写完这个文件(10000 个数据结构,每个“条目”数组是 90000 个浮点数)后,我尝试使用以下函数对这个文件进行内存映射,以便我可以更快地读取数据。这是我到目前为止所拥有的:

在函数结束时,在内存被映射并且我返回一个指向内存块“pBuf”开头的指针之后,我不知道该怎么做才能将该内存块读回我的数据中结构体。所以最终我想把这块内存转移回我的 10000 个数据结构条目的数组中。当然,我这样做可能完全错了......

0 投票
4 回答
3465 浏览

java - Java中的内存映射集合

我正在填满 JVM 堆空间。

更改参数以向 JVM 提供更多堆空间,或更改代码中算法中的某些内容以不使用太多空间是最推荐的两个选项。

但是,如果这两个已经被尝试和应用过,并且我仍然会出现内存不足的异常,我想看看其他选项是什么。

我发现了这个“使用内存映射文件来处理巨大的矩阵”的例子和一个名为HugeCollections的库,这是解决我的问题的一种有趣的方法。不幸的是,这个库已经一年多没有更新了,而且它不在任何 Maven 存储库中——所以对我来说它不是一个真正可靠的库。

我的问题是,是否有任何其他库这样做,或者实现它的好方法(具有集合对象(列表和集合)内存映射)?

0 投票
1 回答
564 浏览

c++ - ostream 打印内存映射然后转储核心

我有一个程序,我试图在其中实现优先级队列。在 PriorityQueue.h 文件中,我重载了 ostream 运算符 <<,但是当调用该函数时,从队列中打印出正确的值后,它会打印内存映射,然后转储我的核心并退出程序。

这是输出队列内容的调用(此行位于我的 main.cpp 文件中);

其中 Q1 是我的优先级队列,按顺序包含值 10、5 和 1。

这是我的 PriorityQueue.h 文件,底部是我定义重载 ostream 运算符的位置。

编辑:

这是程序的输出

0 投票
2 回答
4424 浏览

process - Linux中进程的内存映射

我有以下代码,我组装并链接以从中获取可执行文件。

你好:.ascii "Hello World" .text

.global _start

_start: movl $4,%eax movl $1,%ebx movl $hello,%ecx movl $11,%edx int $0x80

作为一个学习过程,我想看一下进程的内存映射(通过上面的可执行文件)。pmap 和 cat /proc/PID/maps 都需要进程 ID。如果它是 gcc 编译的 C 程序,我可以使用 gdb 设置断点并在另一个终端中获取 pid。

对于上述情况,我无法设置任何断点,因为可执行文件中没有可用的调试器符号表。有没有其他方法可以在不使用 pid 的情况下查看进程内存结构?我的意思是某种加载可执行文件并转储内存结构的程序。

谢谢您的帮助。

0 投票
1 回答
1211 浏览

c# - 从 MMF 访问 SQLite 数据库

我正在使用System.Data.SQLitelib 访问我的 SQLite 数据库。我想将 db 文件加载到内存并使用 MMF(内存映射文件)来访问数据库。

这可以使用默认的SQLite库吗?

编辑:

欢迎使用有关如何拥有内存数据库的替代方案。

0 投票
2 回答
5545 浏览

linux - Linux - 在内核代码中映射用户空间内存

我正在编写一段代码,该代码需要在 SOC 关闭之前存储位于特定物理地址的 10k 内存。

我的问题是这个物理地址不是内核空间的一部分,所以我必须创建一个临时内存映射,这样我才能访问这个内存空间。

我尝试使用 io-remap 但它(显然)不适用于非内核空间。

是否有任何 API 可以做到这一点?我应该使用 kmap 吗?

提前致谢