问题标签 [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 回答
755 浏览

winapi - 寻找内核驱动I/O接口能力的解释

我正在研究从 32 位 XP 到 64 位 Win7 及更高版本的各种 Windows 版本与特定硬件 I/O 地址的接口方式。似乎在不同的 Windows 版本下发布了具有不同程度功能的各种解决方案,我试图了解创建自己的内核驱动程序的可能性。最基本的内核 I/OR/W 功能似乎是直接 I/O 操作,例如 READ_PORT_UCHAR 和 WRITE_PORT_UCHAR(以及它们的 word 和 long 派生词)。我也看过下面的技术我不明白,似乎是一些我没有经验并且几乎找不到可读文档的内存映射功能。有人可以评论 READ_PORT_UCHAR / WRITE_PORT_UCHAR 与我在下面复制的这种映射技术的适用性/兼容性吗?

提前致谢。

0 投票
1 回答
462 浏览

windows - 识别内存映射文件

我正在使用 VirtualQuery 识别部分进程的虚拟内存。我确定了映射文件(MEM_MAPPED)占用的区域,但是如何确定分配在那里的文件的实际文件(文件名)?我想它与 MapView* API 系列有关,但不能完全弄清楚......

0 投票
1 回答
4384 浏览

java - 使用 Java 映射大于 2GB 的文件

可以笼统地说:如何byte[] get(offset, length)在Java中实现大于2GB的内存映射文件的方法。

有上下文:

我正在尝试使用随机 i/o 有效读取大于 2GB 的文件。当然这个想法是使用 Java nio 和内存映射 API。

问题在于内存映射的 2GB 限制。一种解决方案是映射多个 2GB 的页面并通过偏移量进行索引。

这里有一个类似的解决方案:

Java中排序(内存映射?)文件中的二进制搜索

这个解决方案的问题是它被设计为在我的 API 应该读取时读取字节byte[](所以我的 API 类似于read(offset, length))。

将其更改为 终极 是否get()可行get(offset, length)?当byte[]我正在阅读的内容位于两页之间时会发生什么?

0 投票
1 回答
4681 浏览

memory - vxWorks 6.8 将物理内存映射到虚拟内存

这是我在这里的第一个问题:)。

我一直在尝试将物理内存映射到 vxWorks 6.8 中的虚拟内存,但没有成功,我正在尝试使用“vmMap”函数,但不知何故它一直返回:

errno = 0x30065 S_taskLib_NAME_NOT_FOUND。

我的代码是:

任何帮助将不胜感激,谢谢,

莫舍。

0 投票
1 回答
1264 浏览

shared-memory - 打印共享内存的物理地址空间

在 C 程序中,我有 2 个程序,一个用于将字符串存储在共享内存中,另一个程序是通过访问共享内存来打印相同的字符串。



0 投票
2 回答
1156 浏览

c++ - 如何将结构导出到文件,然后对文件进行内存映射?

我有一个我想导出到文件的结构,然后 mmap() 该文件。一个问题是该结构有一个字符串成员变量,我不确定 mmap 将如何处理它。在这种情况下,所有这些字符串的大小都相同,均为 8 个字符。我在 Windows 上工作,虽然我使用的是我在网上找到的mmap()函数,它应该复制 Linux mmap() 函数。

结构本身定义为:

是否可以为对象定义 sizeof() 的返回值?

可以映射包含结构数据的文件吗?

我必须使用什么代码将结构导出到文件,然后对其进行映射?

0 投票
1 回答
1904 浏览

memory - 当处理器访问内存映射寄存器时,它实际上是在访问设备吗

假设一个设备有一个寄存器,而 CPU 有一个类似 x86 的架构。该寄存器映射到物理地址 0x50000 的内存。

处理器将 0X00ABCDEF 写入 0x50000(物理)。如果我能够通过“打开”一个 RAM 银行来检查该地址,我应该找到什么?0X00ABCDEF 还是垃圾?

我假设设备的寄存器上已经有 0X00ABCDEF。如果我错了,请纠正我。

0 投票
5 回答
3702 浏览

c++ - “活在内存映射文件中的 C++ 对象”?

因此,我在 Gamasutra 阅读了对 John Carmack 的采访,其中他谈到了他所谓的“存在于内存映射文件中的实时 C++ 对象”。以下是一些报价:

JC:是的。实际上,我从中获得了很多好处……上一个 iOS Rage 项目,我们提供了一些新技术,这些技术使用一些聪明的东西来制作活的 C++ 对象,这些对象存在于内存映射文件中,由闪存文件系统支持在这里,这就是我想在 PC 上构建我们所有未来工作的方式。

...

我在这里对自己的行军命令是,我希望在我们的 PC 平台上加载两秒的游戏,这样我们就可以更快地迭代。而现在,即使使用固态驱动器,您在加载时所做的所有事情都被您所支配,因此需要这种不同的纪律才能说“所有内容都将被抽取并用于相对地址”所以你只需说,“映射文件,我所有的资源都在那里,并且在 15 毫秒内完成。”

(完整的采访可以在这里找到)

有人知道卡马克在说什么,以及你将如何设置这样的东西吗?我在网上搜索了一下,但我似乎找不到任何东西。

0 投票
1 回答
1870 浏览

c - Windows 和 Linux 上的内存页面写入检测

我目前正在研究世代垃圾收集器。这意味着只有最近的对象被遍历,幸存的对象(=从已知的根可到达)被提升到老一代。当对象指向相同或老一代的其他对象时,这可以正常工作。但是,当较旧的对象指向较新的对象时,并且由于仅遍历较新的对象,指向的对象将被错误地收集。为避免这种情况,此类对象在每个 GC 阶段都会被显式标记和遍历。

显然,这样的“父”对象是可变的,因为通过构造不可变的对象总是指向现有对象。因此,要成为“父对象”,必须在提升后修改对象,使其指向更新的对象。

为了知道老一代的哪些对象指向了年轻一代,我正在寻找一种透明地监控内存变化的方法。为此,我使用内存保护和信号/异常处理。内存页面设置为只读,这会导致在写入时引发信号/异常,在这种情况下,我将内存保护设置回读写并将地址记录在某处以进行进一步处理,并返回负责的代码异常恢复正常。这样,当 GC 触发时,我知道在哪里寻找潜在的父母进行遍历。

在 Linux 上,我使用 mprotect/SIGSEGV 信号处理的组合。在 Windows 上,我打算使用 VirtualProtect,但没有发现 SIGSEGV 处理的等效项。所以我的问题:

  1. 你会如何在 Windows 上做到这一点?异常处理 API 似乎相当混乱。

  2. 有没有更好的方法来知道哪些内存区域被修改了,这样我就不必做所有这些簿记了?

我的代码是用纯 C 编写的。目前我需要调用者代码来显式地标记修改过的对象,但这很乏味且容易出错,所以我正在寻找一种透明的方式来做到这一点。

在此先感谢,弗雷德

0 投票
3 回答
2584 浏览

c - ELF64/x86_64 和内存映射段的起始地址(对于共享对象)

我编写了几个程序,发现当以 64 位编译时,内存映射段(例如共享对象和共享内存所在的位置)总是位于 7f9aca84a000-7fff88400000 附近的某个位置,但从不完全相同。

我想知道在 x86_64 架构(ELF64)上这个内存段是否有固定的起始地址,或者这个段的最大和最小范围是多少?

这就是我问这个问题的原因。我们正在将系统从 Tru64 UNIX 迁移到 Linux。该系统使用IPC Sys V共享内存的复杂固定内存映射,并使用链表在该段内从结构到另一个结构。由于这段代码的大小和复杂性,以及我们手头有限的时间,我们正试图找到一种可靠的方法来修复共享内存的开始(有效地使用带有指定地址的 shmat 来附加段)。使用 64 位,虚拟地址空间是如此巨大(48 位有效可能的地址),以至于选择“安全”固定地址比 32 位更容易且风险更小。