问题标签 [mmap]

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 回答
2875 浏览

linux-kernel - 为什么 COW mmap 在大于 4GB 的(稀疏)文件上使用 ENOMEM 失败?

当尝试使用写时复制语义(PROT_READ | PROT_WRITE 和 MAP_PRIVATE)映射 5GB 文件时,会在 2.6.26-2-amd64 Linux 内核上发生这种情况。映射小于 4GB 的文件或仅使用 PROT_READ 可以正常工作。这不是本问题中报告的软资源限制问题;虚拟限制大小是无限的。

这是重现问题的代码(实际代码是Boost.Interprocess的一部分)。

这就是发生的事情:

这是相关的 strace (新编译的 4.5.20)输出,正如 nos 所要求的那样。

0 投票
1 回答
3386 浏览

macos - 如何在 OSX 上创建没有后备文件的内存映射文件?

我想使用一个使用文件描述符作为访问其数据的基本手段的库。出于性能原因,我不想在使用这个库的函数之前都将文件提交到磁盘。

我想动态创建(大)数据块,并调用库将它们发送到服务器。就目前而言,我必须将文件写入磁盘,打开它,将 FD 传递给库,等待它完成,然后删除磁盘上的文件。由于我可以按需重新创建 blob(并且它们不会太大以至于导致过多的虚拟内存分页),因此将它们保存到磁盘对我没有任何好处,并且会导致很大的性能损失。

是否可以将 FD 分配给仅作为内存映射实体驻留的数据块?

0 投票
2 回答
6701 浏览

c++ - GDB 无法访问 mmap() 的内核分配内存?

我遇到了 GDB 和内核空间中分配的一些缓冲区的问题。缓冲区由内核模块分配,该内核模块应该分配连续的内存块,然后通过 mmap() 调用将内存映射到用户空间。然而,GDB 似乎无法随时访问这些块。例如,在 GDB 中遇到断点后:

但是,查看 /proc//smaps 中应用程序当前映射的内存区域显示:

我什至正在研究这个的原因是因为在运行期间的某个时刻,这个缓冲区地址(或以类似方式分配的另一个)会导致 SIGSEGV。

尽管缓冲区在崩溃之前已被大量使用,并且 /proc//smaps 文件仍显示此缓冲区要像上面那样映射,但仍会发生此段错误。

我完全不知道为什么会发生这种情况,以及为什么映射在 /proc 中似乎有效但在 GDB 中却从来没有。

0 投票
2 回答
6524 浏览

c - mmap 有什么作用?

这行代码有什么作用?

0 投票
2 回答
834 浏览

winapi - Win32 内存映射文件的部分取消映射

我有一些代码(我无法更改)需要在本机 Win32 环境中工作。这段代码调用mmap()and munmap(),所以我使用CreateFileMapping(),MapViewOfFile()等创建了这些函数来完成同样的事情。最初这工作正常,并且代码能够按预期访问文件。不幸的是,代码继续到munmap()它不再需要的文件的选定部分。

不幸的是,当您将指针传递到映射范围的中间时,UnmapViewOfFile()它会破坏整个映射。更糟糕的是,我看不出我如何能够检测到这是一个部分取消映射请求并忽略它。

我曾尝试调用VirtualFree()范围,但不出所料,这会产生 ERROR_INVALID_PARAMETER。

我开始认为我将不得不使用静态/全局变量来跟踪所有打开的内存映射,以便我可以检测并忽略部分取消映射,但我希望你有一个更好的主意......

编辑:

由于我上面不够明确: UnMapViewOfFile 的文档不能准确地反映该函数的行为。

取消映射整个视图并重新映射片段不是一个好的解决方案,因为您只能为新映射建议一个基地址,您无法真正控制它。的语义munmap()不允许更改仍映射部分的基地址。

我真正需要的是一种找到已映射内存区域的基地址和大小的方法。

编辑2:现在我以这种方式重申问题,看起来该VirtualQuery()功能就足够了。

0 投票
2 回答
3903 浏览

atomic - 内存映射文件和单个块的原子写入

如果我使用普通的 IO API 读取和写入单个文件,则可以保证写入在每个块的基础上都是原子的。也就是说,如果我的写入只修改了一个块,操作系统保证要么写入整个块,要么什么都不写入。

如何在内存映射文件上实现相同的效果?

内存映射文件只是字节数组,因此如果我修改字节数组,操作系统无法知道我何时认为写入“完成”,因此它可能(即使不太可能)换出内存中的内存在我的块写入操作的中间,实际上我写了半个块。

我需要某种“进入/离开临界区”,或者在写入文件时将文件的页面“固定”到内存中的某种方法。存在这样的东西吗?如果是这样,是否可以跨常见的 POSIX 系统和 Windows 移植?

0 投票
1 回答
493 浏览

linux - 将页面插入大型 mmap() 文件而不复制数据

我想知道是否有一种方法可以在我用 mmap() 打开的大型(多 GB)文件的开头附近插入空白页。显然,可以在末尾添加一两页,然后使用 memcpy() 将所有内容向前移动,但这会弄脏每一页,并且在最终刷新到磁盘时需要很长时间。

我猜测解决方案需要在自定义文件系统和页表的手动操作之间进行一些复杂的协调:向 inode 添加一个块,以某种方式更新 VMM 中的缓存页以反映这一点,然后以某种方式将页表调整为匹配。这听起来很重要,这让我想知道是否有更好的方法。

这是一个关于 Linux 上的内存和文件操作的有点深奥的问题,尽管我很高兴听到如何在其他系统中做到这一点。我对涉及使复制更有效的解决方法不是特别感兴趣,尽管需要重新映射但避免磁盘 IO 的技术将是一个好的开始。

0 投票
1 回答
3748 浏览

linux - Linux内存映射文件保留大量物理内存

我有一个在多个线程中描述的问题,涉及内存映射和 Linux 下不断增长的内存消耗。

当我在 Linux 或 MacOS X 下打开一个 1GB 文件并将其映射到内存中时

并顺序读取映射内存,尽管我使用了 posix_madvise (甚至在读取过程中多次调用它),但我的程序使用了越来越多的物理内存:

没有成功。:-(

我试过了:

  • 不同的标志 MMAP_RANDOM、MMAP_DONTNEED、MMAP_NORMAL 没有成功
  • posix_fadvise(me.file.handle, 0, capacity(me), POSIX_FADV_DONTNEED) 在调用 mmap 前后 -> 不成功

可以在 Mac OS X 下运行!!!当我结合

常驻内存低于 16M(我在 16mio 步骤后定期调用 msync)。

但在Linux 下没有任何效果。有人对我在 Linux 下的问题有想法或成功案例吗?

干杯,大卫

0 投票
2 回答
553 浏览

c - 如何代理跨网络的 mmap 读取和写入?

我正在开发软件来控制嵌入式 ARM 系统上的 mmap 设备,但遇到了一些可用的调试和开发工具还不够的情况。即 valgrind 和高端螺纹分析仪等仪表工具不可用。

我想做的是在 x86 机器上编译我的代码,使用相同大小映射一个“虚拟”内存段,然后通过网络将这些读/写代理到嵌入式机器,然后可以相应地响应。

我意识到这可能需要一个客户端/服务器机制,并且速度会非常慢,但是拥有这个选项的好处将使 mmap 接口本身之外的机制(异步事件处理、线程管理)可用于使用 x86 开发工具的工具将是很有用。

我在一些用于模拟的 ASIC 开发中听说过这种技术,但从未使用过任何提供这种功能的东西。这里的关键是我想在两个平台上使用相同的代码,而不必重写一堆东西,或者必须编写一个包含任何硬件处理逻辑的内核模块。我想通过 mmap 将所有设备控制逻辑保留在用户区

0 投票
1 回答
1481 浏览

linux-device-driver - 在设备驱动程序中实现具有多个页面的 mmap

我有一个设备驱动程序,它使用 RAM 中的缓冲区,我希望用户能够映射到用户空间。我已经阅读了http://lwn.net/images/pdf/LDD3/ch15.pdf,其中谈到了使用 nopages,但那里的示例仅使用单页并说您可以调整使用次数以使其适用于多页。我不明白这是怎么回事。它使用顺序为 0 的 get_free_page(即 1 个空闲页面)来分配其缓冲区,但我的缓冲区有两页长。

使用计数与什么有什么关系?据我了解,只计算第一页。