mmap

mmap() 在每次缺页后都会更新页表吗?
mmap

mmap() 在每次缺页后都会更新页表吗?

根据我对 mmap() 的研究,我了解到 mmap 仅当通过页面错误触及虚拟内存地址时才使用请求分页将数据复制到内核页面缓存。 如果我们正在读取大于页面缓存的文件,则页面缓存中的一些陈旧页面将必须被换出回收。所以我的问题是,页表是否会更新以将相应的虚拟内存地址映射到缓存中旧的过时页面的地址(现在包含新数据)?这是怎么发生的?这是 mmap() 系统调用的一部分吗? ...

Admin

POSIX 共享内存对象有哪些一致性保证?
mmap

POSIX 共享内存对象有哪些一致性保证?

在 Linux 上,POSIX 共享内存对象 [1] 使用tmpfsvia /dev/shm。反过来, Atmpfs被称为“完全存在于页面缓存中”[2](我假设交换尚未启用)。我想知道使用 POSIX SHM 对象mmap(编入程序地址空间)时的一致性/不撕裂保证是什么。 示例:假设两个进程 A 和 B 共享一个 POSIX SHM 对象,这两个进程都mmap被写入各自的地址空间。该对象的大小为 8kB 或两个页面,假设页面为 4kB 并且对象是页面对齐的。 A 发出两次连续的 [3] 写入,第一次写入第一页(第一个 4k 块),第二次写入第二页。 B 轮...

Admin

Linux 4.x 中如何实现 4kB RSS?
mmap

Linux 4.x 中如何实现 4kB RSS?

自 90 年代末以来,我一直是开源 IRC 机器人的开发/维护者。我们的目标始终是使其在较小的内存占用范围内尽可能通用和有用。 在 2000 年代,我还编写了一些概念验证代码,将有用的程序压缩到只有 4kB RSS,这在 2.4 内核上实现起来并不难。我用 init 和 Agetty 实现了这一点;也就是说,我让它们在单个 4kB 内存页面内常驻运行以履行其职责。 现在,当有一天我要求我的机器人报告其内存使用情况时,它的回应如下: [Mar 27 2018] <bot> VM 1000 kB (Max 2988 kB), RSS 4 kB [ C...

Admin

进程内存布局 - 堆、数据和 mmap 区域之间的区别
mmap

进程内存布局 - 堆、数据和 mmap 区域之间的区别

我在网上看到许多关于 Linux 进程的内存布局的相互矛盾或不清楚的描述。通常情况下常用图好像: 还有一个常见的描述会说: 数据段仅包含具有预定义值并且可以修改的全局或静态变量。堆包含动态分配的数据,这些数据存储在我们称为堆部分的内存部分中,该部分通常从数据段结束的地方开始。 和还: 一般来说,堆是由 C 运行时创建并管理的一个特定内存区域malloc(反过来使用brk 和sbrk系统调用来增长和收缩)。 mmapmalloc是一种独立于(因此独立于堆) 创建新内存区域的方法 。munmap只是它的逆过程,它释放这些区域。 其中许多解释似乎已经过...

Admin

如何读取 x86 Linux 上的看门狗寄存器?
mmap

如何读取 x86 Linux 上的看门狗寄存器?

我想读取我的 Intel Lynx Point 系统上的 Intel iTCO 看门狗寄存器。我在这里找到了看门狗: [ 5598.341020] iTCO_wdt iTCO_wdt.1.auto: Found a Lynx Point TCO device (Version=2, TCOBASE=0x1860) 它连接到ISA桥LPC控制器: 00:1f.0 ISA bridge: Intel Corporation H87 Express LPC Controller (rev 05) Subsystem: ASUSTeK Computer I...

Admin

mmap 可以用来创建一个引用另一个文件的内存子集的文件吗?
mmap

mmap 可以用来创建一个引用另一个文件的内存子集的文件吗?

我有兴趣编写一个可以创建两个文件的程序,第二个文件将是第一个文件的“视图”,如果修改,第一个文件也会被修改。这可以用 mmap 来做吗? 我知道使用 mmap 我可以在 RAM 中拥有共享内存,但我需要非易失性内存(又称硬盘驱动器)中的共享内存。我无法复制第一个文件或将其完全加载到 RAM 中,因为我假设该文件可能非常大(GB)。 在我找到如何让第二个文件显示第一个文件的内存子集后,我计划制作 3 个文件,第一个作为容器,第二个和第三个显示第一个文件的不同子集。第二个和第三个文件将使用文件系统进行格式化,以便第一个文件容器在其内存中保存两个可通过第二个和第三...

Admin

在 1T 块设备中搜索指定偏移处的特定字节序列
mmap

在 1T 块设备中搜索指定偏移处的特定字节序列

我正在使用 dd 发生事故后执行数据恢复。从长远来看,我需要使用一些恢复工具来尝试修复文件系统 与此同时,系统上有一个我需要的映像,如果我能找到该映像,我将能够使用该映像来对设备进行映像。 字节序列是"\x21\x35\x2c\x66\xe4\xe8\x48\xe0\xf9\x4a\x92\x\x7f\x3f\xb7\x6e".我尝试过在Python中使用mmap,但据我所知,mmap.find()它不允许打开块设备,因为我每次尝试时似乎都会遇到错误。 我尝试过使用其他工具,例如 dd 与 grep 结合使用,但它在磁盘的开头进行搜索,而它可能会接近结尾。扫...

Admin

如何测量 mmap I/O 延迟?
mmap

如何测量 mmap I/O 延迟?

我有一个应用程序似乎正在减慢/阻塞,同时有大量磁盘 I/O 正在进行,因此我怀疑应用程序中的 I/O 操作正在阻塞。我无法想象还有什么问题,但我想确认一下。问题是应用程序主要使用 mmap 文件进行 I/O,因此它们不会以strace. 我知道阻塞来自 mmap 内存的 I/O 操作将是一个页面错误。但是有没有办法测量线程执行由于页面错误而暂停的时间量呢? ...

Admin

在 PPC QEMU 中将访客 RAM 段映射到主机文件
mmap

在 PPC QEMU 中将访客 RAM 段映射到主机文件

我的愿望在概念上很简单,我在主机上有一个文件(实际上是来自 /sys/bus/pci/device/.... 的 PCIe 资源文件,但这不是太相关),我希望在来宾中的某个位置可用记忆,以便任何一方的变化都能相互反映。由于我的目标是实际映射主机中有限的 PCIe 地址空间段,因此我无法高效地映射整个来宾 RAM。下面列出了我尝试添加的基本命令。目标是获取映射的内存 id“bar0.ram”某处在客人的记忆中。 qemu-system-ppc -M ppce500 -cpu e500 -m 64M -d guest_errors,unimp -bios $P...

Admin

实际问题
mmap

实际问题

搬家通知 我刚刚从 StackOverflow 问题(我已删除该问题,因为强烈反对交叉发布)中移出了这个问题(稍加修改),该问题在那里尚未得到解答,可能更适合这里。 StackOverflow 问题上有两条评论(但没有答案)。以下是这些评论的简短摘要(请注意,您可能需要阅读实际问题才能理解这一点): 文件系统方法使您能够使用libhugetlbfs它来做各种各样的事情。 这并不能真正说服我 - 如果我作为应用程序程序员可以在不通过文件系统的情况下分配大页面,那么也可以libhugetlbfs,对吧? 通过文件系统,您可以设置谁可以分配大页面的权限。 ...

Admin

写入块设备时的部分 fsyncs
mmap

写入块设备时的部分 fsyncs

我直接在块设备之上编写自己的数据存储。为了确保持久性,我想同步到磁盘。但事情是这样的:我只想同步其中的一部分。 我保留了一份用于崩溃恢复的日志,并将未来的更改写入日志,然后再将它们应用到磁盘上的实际位置。然后我想确保日志更改写入磁盘,然后才对磁盘的其余部分进行实际更改(我不关心 fsync,直到我检查日志)。 我可以简单地同步整个块设备,但这会迫使很多不紧急的事情被写出。 我想到了两种选择,但令我惊讶的是没有部分 fsync(2) 调用,而且从我发现的情况来看,没有人要求它。 mmap(2) 完整的块设备及使用同步(2)同步其中的一部分。 打开(2)块设备...

Admin

两个进程是否可以使用相同的共享内存,而无需借助文件来获取它,无论是内存映射文件还是 /dev/shm 文件?
mmap

两个进程是否可以使用相同的共享内存,而无需借助文件来获取它,无论是内存映射文件还是 /dev/shm 文件?

我很好奇,因为今天我知道如何为两个不同的进程提供相同的共享内存的唯一方法是通过内存映射文件,换句话说,两个进程打开相同的内存映射文件并写入/读取它。 由于操作系统需要在磁盘和内存之间交换,因此这会带来惩罚/缺点。 如果这是一个愚蠢的问题,请提前道歉,但是进程之间是否存在纯粹的共享内存,而不是由文件支持。如果是,如果不使用内存映射文件或 /dev/shm 文件,进程将如何获取它? ...

Admin

哪些 Linux 发行版支持 mmap_shared?
mmap

哪些 Linux 发行版支持 mmap_shared?

mmap_shared我找到了一个名为on 的函数的手册页die.net:https://linux.die.net/man/3/mmap_shared 它看起来像是一个方便的包装函数 around mmap,但是它似乎在 Ubuntu 18.04 上不可用,而且我在其他地方找不到关于它的太多信息。哪些 Linux 发行版支持它? ...

Admin

无法使用分配给具有透明大页面的缓冲区的内存(进程被杀死)
mmap

无法使用分配给具有透明大页面的缓冲区的内存(进程被杀死)

我有 1TB 的 RAM,其中 900GB 需要在进程中分配和使用(我对硬件有完全的控制权,并且我正在裸机上工作)。我使用(私有、匿名)分配 900GB 内存mmap(),然后用于madvise()在 Fedora 37 上设置透明大页。然后这 900GB 线性填充数据。 这不是实际的程序,但它给出了内存访问类型的想法: #include <stdlib.h> #include <stdio.h> #include <stdint.h> #include <sys/mman.h> int main() { ...

Admin

如何打开 TB 大小的 mmap
mmap

如何打开 TB 大小的 mmap

我需要打开一个巨大的内存映射。该文件为 1 TB。 然而我收到了 errno: ENOMEM 12 Cannot allocate memory。我不明白是什么在阻碍我。请求RLIMIT_AS值中的结果:18446744073709551615。这就足够了。我的系统也是64位的,所以并不是我的虚拟内存太小。ulimit -v是ulimited 我用 python 创建了数据,np.lib.format.open_memmap因此它在物理上是可能的。我正在尝试用 C 语言阅读它。Python 阅读没有问题,numpy.load('terabytearray.n...

Admin