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

c# - 关于“冲突”二进制格式的快速二进制读写问题

我正在努力处理二进制(文件)数据(在 c# 中)。这是这种情况:

  • 我有一个可以小至 1 MB 和大至 60 GB 的二进制文件,因此无法装入内存(假设具有 2 GB 内存的慢速笔记本电脑,运行 32 位和 64 位窗口)。例如,该文件包含来自一个时基的 20 个源的数据。该文件的标题没有告诉我信号的长度,这意味着每个信号的长度可以(并且大多数情况会)不同。因此,我不知道一个信号正手包含的字节数。另请注意,数据沿文件的间距不均匀。因此,我必须在文件中搜索与相应信号样本匹配的标识符(2 个字节)。

  • 其次,我需要处理这些数据并将其存储在一个新的二进制文件中。文件大小将大致相同。但是二进制格式完全不同。实际上它是一种 Matlab 二进制文件格式。

这些是挑战:

  • 由于 Matlab 二进制文件需要信号头中的信号长度(以字节数给出),我需要知道正手的长度。或者,或者在最后返回写入的二进制文件并存储长度。
  • 性能需要非常好。Target 正在接近硬盘的 r/w 速度,因此 CPU 时间需要较低。
  • 由于数据不适合内部存储器,我需要一些分块处理。但是如何正确限制块大小,以便在不牺牲性能的同时不会出现内存溢出异常?

我已经尝试过要读取的文件的内存映射,但我坚持这一点,因为我需要沿着完整的文件搜索以了解信号的长度。

什么是完成上述工作的好方法?

0 投票
2 回答
690 浏览

linux - 将多个数据数组映射到任意固定内存地址

我正在 64 位 Linux 机器上开发一个程序,该程序需要将多个任意长度的数据数组映射到我无法控制的固定内存地址。我认为 mmap() 与 MAP_FIXED 和 MAP_ANONYMOUS 是要走的路,例如:

但是,每次我调用此函数时,它都会返回 MAP_FAILED。我已将fd设置为 -1,我知道某些系统需要它,地址是我的页面大小 (4096) 的倍数,并且长度是非负数,所以我想知道 0x401000 是否已经存在我的系统使用;我也尝试过 0x402000、0x403000 和 0x404000,结果相同。

关于 mmap(),我是否遗漏了什么,或者有没有办法找出这个地址已经有什么?更好的是,由于我无法控制我需要哪些地址,有没有更好的方法来避免遇到现有映射?

编辑:检查后errno,我发现我得到的代码是一个无效参数,因此,根据手册页,“我们不喜欢 addr、length 或 offset(例如,它们太大或未对齐)在页面边界上)。” 不过,我还不能弄清楚哪一个是问题所在。

0 投票
1 回答
571 浏览

c++ - 简单的进程加载器内存映射

我正在为 Linux 编写一个非常简单的进程加载器。我正在加载的可执行文件已经编译,并且我知道每个可执行文件在内存中的位置。我尝试的第一种方法是mmap()手动将每个代码或数据部分放在正确的位置,例如

除非我删除 MAP_FIXED 标志,否则会出现段错误,因为似乎一个块的地址与内存中已经存在的东西冲突,甚至可能与加载程序本身冲突;该地址0x401000似乎是有问题的地址。

我什至不确定从哪里开始。有朋友建议虚拟化内存访问操作;我不确定我会为此采取什么样的性能打击,我也不知道它是如何完成的,但它可能是一种选择。我真正想做的是创建一个“空”进程,就它而言,它会完全运行内存,因此在我想要它之前不会将任何内容加载到用户空间中。“空”过程的整个概念可能毫无意义,但它是描述我想要什么的最佳方式。我非常渴望一些可能对我有帮助的参考资料或示例。

0 投票
2 回答
2416 浏览

c# - 在 C# 中的两个进程之间共享对象

我正在寻找一种在两个进程之间共享对象的方法。第一个进程应该创建对象,第二个进程应该只复制它而不对原始对象进行任何更改。

有谁知道如何做到这一点?

0 投票
2 回答
7888 浏览

c - 可执行 C 程序中的段

我正在阅读有关部分和片段的内容。似乎您可以列出部分和段之间的映射,如下所示。

我的问题,

  1. 我不明白程序标题是什么意思?它们与细分市场有什么关系?
  2. 段到段的映射很清楚。但有人能说出它的名字吗?我只看到数字。我确定了代码段(03)、数据段(02)和堆栈(07)。
0 投票
2 回答
1043 浏览

driver - 虚拟内存系统中的设备驱动程序

假设有一个设备使用内存映射 I/O,即有一个特定范围的物理内存分配给这个设备

如果不使用虚拟内存系统,那么通过使用相应物理地址完成的读/写操作来操作设备非常简单

如果有虚拟内存系统呢?

设备驱动程序需要知道分配给该设备的特定物理内存范围,但是如果它应该使用虚拟地址而不是物理地址,它如何访问该地址范围?

0 投票
1 回答
1425 浏览

c - Mmap 没有使用给定的地址

虽然请求的映射地址是页起始地址,但它会使用移位了几页的地址。

我正在尝试做这样的事情:

样本输出(page_size= 4096= 0x1000):

偏移量为 2 页。这似乎也随length. 例如,如果我尝试映射 4 页而不是一页,则输出变为:

这是 5 页偏移量。

为什么会这样?

0 投票
2 回答
75894 浏览

linux - 如何从 Linux 中的用户空间访问物理地址?

在运行 Linux 的基于 ARM 的系统上,我有一个内存映射到物理地址的设备。从所有地址都是虚拟的用户空间程序中,如何从该地址读取内容?

0 投票
0 回答
1155 浏览

linux-kernel - Linux中块IO设备中的内存映射

我正在Linux中进行设备驱动程序开发。我在 Linux 中遇到过设备驱动程序的内存映射。

我试图开发一个 RAM Disk 块设备驱动程序(它从 RAM 中创建虚拟磁盘)。但我不知道如何在这里使用内存映射(只是为了尝试)。

我猜块设备会使用内存映射。

有人可以对此有所了解吗?

另外,如果我们使用 remap_pfn_range 映射用户空间中的内存,那将如何工作?如果用户只是在区域上写了一些东西,它会自动反映在设备内部还是会调用为 I/O 注册的请求函数?

0 投票
1 回答
70 浏览

c - 是否有任何操作系统允许应用程序程序员从 thunk 中创建指针?

许多操作系统允许存储映射文件,并懒惰地读取它们。如果操作系统可以做到这一点,那么它就有能力从 thunk 中创建常规指针。

是否有任何操作系统允许应用程序程序员从他自己的 thunk 中创建指针?

我知道操作系统在一定程度上已经支持此功能,因为可以创建一个管道,将其映射到内存中,并将一个进程连接到管道以完成我正在谈论的一些事情,所以这个功能似乎不太不可能或不合理。

这个特性的一个简单例子是一个指针,它计算它被取消引用的次数。以下程序将输出零,然后输出一。

PS 需要一个 volatile 限定符,因为 x 指向的值会意外更改,对吧?同样,编译器没有理由认为取消引用 x 会改变计数器,所以那里也需要一个 volatile 对吗?