问题标签 [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.
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 与我在下面复制的这种映射技术的适用性/兼容性吗?
提前致谢。
windows - 识别内存映射文件
我正在使用 VirtualQuery 识别部分进程的虚拟内存。我确定了映射文件(MEM_MAPPED)占用的区域,但是如何确定分配在那里的文件的实际文件(文件名)?我想它与 MapView* API 系列有关,但不能完全弄清楚......
java - 使用 Java 映射大于 2GB 的文件
可以笼统地说:如何byte[] get(offset, length)
在Java中实现大于2GB的内存映射文件的方法。
有上下文:
我正在尝试使用随机 i/o 有效读取大于 2GB 的文件。当然这个想法是使用 Java nio 和内存映射 API。
问题在于内存映射的 2GB 限制。一种解决方案是映射多个 2GB 的页面并通过偏移量进行索引。
这里有一个类似的解决方案:
这个解决方案的问题是它被设计为在我的 API 应该读取时读取字节byte[]
(所以我的 API 类似于read(offset, length)
)。
将其更改为 终极 是否get()
可行get(offset, length)
?当byte[]
我正在阅读的内容位于两页之间时会发生什么?
memory - vxWorks 6.8 将物理内存映射到虚拟内存
这是我在这里的第一个问题:)。
我一直在尝试将物理内存映射到 vxWorks 6.8 中的虚拟内存,但没有成功,我正在尝试使用“vmMap”函数,但不知何故它一直返回:
errno = 0x30065 S_taskLib_NAME_NOT_FOUND。
我的代码是:
任何帮助将不胜感激,谢谢,
莫舍。
shared-memory - 打印共享内存的物理地址空间
在 C 程序中,我有 2 个程序,一个用于将字符串存储在共享内存中,另一个程序是通过访问共享内存来打印相同的字符串。
c++ - 如何将结构导出到文件,然后对文件进行内存映射?
我有一个我想导出到文件的结构,然后 mmap() 该文件。一个问题是该结构有一个字符串成员变量,我不确定 mmap 将如何处理它。在这种情况下,所有这些字符串的大小都相同,均为 8 个字符。我在 Windows 上工作,虽然我使用的是我在网上找到的mmap()函数,它应该复制 Linux mmap() 函数。
结构本身定义为:
是否可以为对象定义 sizeof() 的返回值?
可以映射包含结构数据的文件吗?
我必须使用什么代码将结构导出到文件,然后对其进行映射?
memory - 当处理器访问内存映射寄存器时,它实际上是在访问设备吗
假设一个设备有一个寄存器,而 CPU 有一个类似 x86 的架构。该寄存器映射到物理地址 0x50000 的内存。
处理器将 0X00ABCDEF 写入 0x50000(物理)。如果我能够通过“打开”一个 RAM 银行来检查该地址,我应该找到什么?0X00ABCDEF 还是垃圾?
我假设设备的寄存器上已经有 0X00ABCDEF。如果我错了,请纠正我。
c++ - “活在内存映射文件中的 C++ 对象”?
因此,我在 Gamasutra 阅读了对 John Carmack 的采访,其中他谈到了他所谓的“存在于内存映射文件中的实时 C++ 对象”。以下是一些报价:
JC:是的。实际上,我从中获得了很多好处……上一个 iOS Rage 项目,我们提供了一些新技术,这些技术使用一些聪明的东西来制作活的 C++ 对象,这些对象存在于内存映射文件中,由闪存文件系统支持在这里,这就是我想在 PC 上构建我们所有未来工作的方式。
...
我在这里对自己的行军命令是,我希望在我们的 PC 平台上加载两秒的游戏,这样我们就可以更快地迭代。而现在,即使使用固态驱动器,您在加载时所做的所有事情都被您所支配,因此需要这种不同的纪律才能说“所有内容都将被抽取并用于相对地址”所以你只需说,“映射文件,我所有的资源都在那里,并且在 15 毫秒内完成。”
(完整的采访可以在这里找到)
有人知道卡马克在说什么,以及你将如何设置这样的东西吗?我在网上搜索了一下,但我似乎找不到任何东西。
c - Windows 和 Linux 上的内存页面写入检测
我目前正在研究世代垃圾收集器。这意味着只有最近的对象被遍历,幸存的对象(=从已知的根可到达)被提升到老一代。当对象指向相同或老一代的其他对象时,这可以正常工作。但是,当较旧的对象指向较新的对象时,并且由于仅遍历较新的对象,指向的对象将被错误地收集。为避免这种情况,此类对象在每个 GC 阶段都会被显式标记和遍历。
显然,这样的“父”对象是可变的,因为通过构造不可变的对象总是指向现有对象。因此,要成为“父对象”,必须在提升后修改对象,使其指向更新的对象。
为了知道老一代的哪些对象指向了年轻一代,我正在寻找一种透明地监控内存变化的方法。为此,我使用内存保护和信号/异常处理。内存页面设置为只读,这会导致在写入时引发信号/异常,在这种情况下,我将内存保护设置回读写并将地址记录在某处以进行进一步处理,并返回负责的代码异常恢复正常。这样,当 GC 触发时,我知道在哪里寻找潜在的父母进行遍历。
在 Linux 上,我使用 mprotect/SIGSEGV 信号处理的组合。在 Windows 上,我打算使用 VirtualProtect,但没有发现 SIGSEGV 处理的等效项。所以我的问题:
你会如何在 Windows 上做到这一点?异常处理 API 似乎相当混乱。
有没有更好的方法来知道哪些内存区域被修改了,这样我就不必做所有这些簿记了?
我的代码是用纯 C 编写的。目前我需要调用者代码来显式地标记修改过的对象,但这很乏味且容易出错,所以我正在寻找一种透明的方式来做到这一点。
在此先感谢,弗雷德
c - ELF64/x86_64 和内存映射段的起始地址(对于共享对象)
我编写了几个程序,发现当以 64 位编译时,内存映射段(例如共享对象和共享内存所在的位置)总是位于 7f9aca84a000-7fff88400000 附近的某个位置,但从不完全相同。
我想知道在 x86_64 架构(ELF64)上这个内存段是否有固定的起始地址,或者这个段的最大和最小范围是多少?
这就是我问这个问题的原因。我们正在将系统从 Tru64 UNIX 迁移到 Linux。该系统使用IPC Sys V共享内存的复杂固定内存映射,并使用链表在该段内从结构到另一个结构。由于这段代码的大小和复杂性,以及我们手头有限的时间,我们正试图找到一种可靠的方法来修复共享内存的开始(有效地使用带有指定地址的 shmat 来附加段)。使用 64 位,虚拟地址空间是如此巨大(48 位有效可能的地址),以至于选择“安全”固定地址比 32 位更容易且风险更小。