Articles of mmap

为什么关于mmap的代码在(16384 + 1)字节而不是(4096 + 1)字节处得到段错误?

操作系统是Ubuntu。 在我看来,页面大小为4096,在第(4096 + 1)字节处应该得到段错误,但是在写入(16384 + 1)字节时得到段错误。 输出:… 16383一个分段错误 #include <sys/mman.h> // memory management. #include <sys/stat.h> // file stat. man 2 stat #include <fcntl.h> // O_CREAT #include <unistd.h> #include <errno.h> #include <stdio.h> int main(int argc, char* argv[]) { const int page_size = getpagesize(); printf("page_size: %d\n", page_size); int shm_fd = open("shm.temp", O_CREAT | O_RDWR, S_IRWXU); ftruncate(shm_fd, 1); […]

使用mremap()将两个相同的页面合并到一个物理页面中

我有一个C代码,我知道void * p1指向的页面内容与page void * p2指向的内容相同。 p1和p2是dynamic分配的。 我的问题是我可以使用remap()让这两个页面指向相同的物理页面,而不是有两个相同的物理页面? 编辑:我试图改变这个过程的页表中的虚拟物理映射,以便p1和p2指向相同的物理地址。 我不想让p1和p2虚拟地指向相同的东西。

使用mmap和/ proc / mtrr访问无法访问的区域

我正在使用mmap和/ proc / mtrr来尝试对物理内存分析做一些深入的分析。 以下是我想要做的事情的基本概念以及迄今为止所做的工作的总结。 我在Ubuntu内核版本3.5.0-54-通用。 我基本上是映射到一个特定的物理地址(使用/ proc / iomem的提示),并测量这个物理地址范围的访问延迟。 这是我迄今为止所做的: 在/ proc / mtrr中创build了一个条目,使物理地址范围可以映射到不可取的地方。 使用/ dev / memconfiguration到特定的地址。 我不得不放宽安全限制,以便从/ dev / mem读取超过1 MB的数据。 虽然我能够执行这个程序没有问题,但我对这个不可兼容的部分是否真正起作用有一些怀疑。 这里是我正在使用的代码片段。 请注意,我使用了先前研究论文中的伪代码来创build此代码。 int main(int argc, char *argv[]) { int fd; // file descriptor to open /dev/mem struct timespec time1, time2; fd = open("/dev/mem", O_RDWR|O_SYNC); if (fd == -1) { printf("\n […]

Linux给malloc()多less内存?

这是一个Linux系统问题,而不是一个编码问题。 当我使用“top”来检查程序的内存使用情况时,它报告的值是内存分析器Valgrind的Massif给出的实际堆分配的3-4倍。 这是一个大的程序,差别是数百兆字节。 Valgrind手册仅给出部分解释: (Massif)不会直接测量使用mmap,mremap和brk等较低级系统调用分配的内存。 堆分配函数(如malloc)build立在这些系统调用之上。 例如,在需要的时候,分配器通常会调用mmap来分配一大块内存,然后响应对malloc等的调用,将那块内存块交给客户端程序。 Massif直接测量这些更高级别的malloc和等级调用,而不是较低级别的系统调用。 好,但是我真的从系统中拿走了多less内存? 我需要能够在一台机器上运行尽可能多的程序实例,所以我需要知道有多less内存仍然可用。 页面alignment等无法解释报告的内存使用情况中数百兆字节的差异。 另外,什么决定了底层mmap()调用的块大小? 我看到一个64MB的数据块一度被占据,而这个数据看起来非常大。

Java FileChannel缺lessunmap(RAM后果?)

我在我的应用程序中创build/使用FileChannel.MapMode.READ_WRITE模式下的内存映射文件。 Thoses文件在应用程序的整个生命周期中被创build和删除。 由于GC不需要释放直接缓冲区来parsing底层的操作系统缓冲区,所以我想知道在操作系统中有什么后果,更具体地说是关于内存使用情况。 我理解的过程中的“虚拟内存”仍然被不必要的映射污染,但是对实际RAM使用的影响是什么(我猜“Resident Memory”中的缓冲区会随着时间的推移而被刷新)。 看来这个进程可能会在操作系统级别(崩溃的JVM)的OOM(内存不足) – 而不是Java OOM(内存不足)(仍然有足够的空间)。 我在Linux 64位(3.13.0-68-通用/ Ubuntu)盒子上,并使用Oracle JRE 1.8.0_66-b17。

如何从linux进程保留特定范围的虚拟内存

i86-32位系统:有没有办法在进程内存映射中保留特定范围的虚拟地址空间,以阻止ld.so(dynamic链接器)将任何共享对象加载到该范围内? 我想使用至less2个1G的虚拟内存来映射两个1G的巨大页面,但是,ld.so在中间加载共享库,所以我不能映射1G巨大的页面。 编译器不能完成这项工作。 链接器脚本不能。 ld.so被加载器加载到可执行文件中,然后ld.so加载其他共享库。 然而,ld.so本身即使在映射空间的中间。 ld.so和libc.so的入口点位于更高的地址,对于我们的应用程序来说不能改变。 入口点地址:0x46c38810 谢谢江涛

使用mmap来映射文件中的不同段

我需要将/dev/mem地址空间映射到我的进程中以访问硬件设备。 有几个设备有不同的偏移量。 这个过程应该相当简单,可以在线获得多个示例: if ((mem_fd_ = open("/dev/mem", O_RDWR)) < 0 ) { std::cerr << "error opening '/dev/mem' " << strerror(errno); return false; } // Map the kernel memory space mmap_addr_ = (uint8_t *)mmap(nullptr, page_size_, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, mem_fd_, offset_chip_addr_); if (mmap_addr_ == MAP_FAILED) { std::cerr << "error in mmap: " << strerror(errno); return false; } 但是所有的例子都只是在一个进程中调用一个mmap […]

从mmap-ed内存中进行有效读取,会产生负载下的SIGBUS。 为什么?

我有一个程序,将缓冲区复制到文件,mmap回来,然后检查其内容。 多个线程可以在同一个文件上工作。 偶尔,我在阅读时得到了SIGBUS,但是只在负载下。 映射是MAP_PRIVATE和MAP_POPULATE。 通过SIGBUS的崩溃发生在mmap成功后,我不明白,因为MAP_POPULATE被使用。 下面是一个完整的示例(在/ tmp / buf_ *下创build填充为零的文件),使用OpenMP创build更多的负载和并发写入: // Program to check for unexpected SIGBUS // gcc -std=c99 -fopenmp -g -O3 -o mmap_manymany mmap_manymany.c #include <assert.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #define NBUFS 64 const char bufs[NBUFS][65536] = {{0}}; const […]

从另一个进程读取未刷新的页面

我有一个生产者进程,写入一个mmap'd文件和一个读取它的消费者进程。 这是在Linux上。 如果生产者改变了mmap,而不是立即刷新,当消费者访问它会发生什么? 它会从磁盘上得到旧版本,还是足够聪明,得到不刷新的页面?

Linux:常规和特权进程之间的mmap MAP_SHARED好吗?

我想要一个在限制用户下运行的进程与一个守护进程共享一个futex,这个守护进程基本上是root用户,可以放弃一些权限。 通常的shm_open和mmap等是否可以与以不同用户运行的进程一起工作,并具有不同的权限? 有什么具体的安全问题,如果有的话(我怎么减轻他们,权限也许)? 这两个过程中的哪一个创buildfd有什么区别?