Articles of mmap

什么是用户进程的有效地址空间? (OS X和Linux)

mmap系统调用文档说,如果出现以下情况,函数将失败: 指定了MAP_FIXED,并且addr参数不是页alignment的,或者所需地址空间的一部分驻留在用户进程的有效地址空间之外。 我无法在任何地方find说明什么是有效地图的文档。 (我有兴趣在OS X和Linux上执行此操作,理想情况下相同的地址对于这两个操作都是有效的)。

使用mmap增加文件的大小

在Windows上的Python中,我可以通过创build一个大文件 from mmap import mmap f = open('big.file', 'w') f.close() f = open('big.file', 'r+') m = mmap(f.fileno(), 10**9) 现在big.file是(大约)1千兆字节。 但在Linux上,这将返回ValueError: mmap length is greater than file size 。 有没有办法像在Windows上一样在Linux上获得相同的行为? 也就是说,能够使用mmap增加文件的大小?

mmap一个10 GB的文件并加载到内存中

如果我想要mmap一个10 GB的文件并立即将整个文件加载到物理内存中,我该怎么做? 我不想使用像mlock这样的函数,因为它需要root权限。 有没有可以满足我的需求的系统调用? (我有足够的内存。)

mmap()的熵的ASLR位

我正在学习x86系统上的mmap()的ASLR随机化。 我已经读了很多地方,在用mmap()加载的地址上有16位随机数。 但在我发现的源代码中: static unsigned long mmap_rnd(void) 02 { 03 unsigned long rnd = 0; 04 05 /* 06 * 8 bits of randomness in 32bit mmaps, 20 address space bits 07 * 28 bits of randomness in 64bit mmaps, 40 address space bits 08 */ 09 if (current->flags & PF_RANDOMIZE) { 10 if (mmap_is_ia32()) […]

我们可以在同一个/ dev文件上使用两个MMAP

我已经build立了一个字符驱动程序,我使用dma_alloc_coherent()分配了两个PAGESIZE缓冲区 现在我使用ioctl()作为source_offset和dest_offset将这些BUFFER [src_ptr&dest_ptr]的PHYSICAL地址传递给用户空间。 在用户空间中,这个offeset被用作mmap调用的偏移量。 所以在同一个/ dev文件说/ dev / 250我正在做两个MMAP调用 usr_src_ptr= mmap(0,page_size, PROT_READ|PROT_WRITE, MAP_SHARED,dev_FD, src_offset ); if (usr_src_ptr == MAP_FAILED){ printf("USR[UPP]:SOURCE MMAP FAiled \n\n"); close(dev_FD); exit(-1); }else{ printf("USR[UPP]:SOURCE MMAP is %X..\n",usr_src_ptr); } usr_dest_ptr= mmap(0,page_size, PROT_READ|PROT_WRITE,MAP_SHARED, dev_FD,dest_offset ); if (usr_dest_ptr == MAP_FAILED){ printf("USR[UPP]:DEST MMAP FAiled \n\n"); close(dev_FD); exit(-1); }else{ printf("USR[UPP]:DEST MMAP is %X..\n",usr_dest_ptr); } 我在用户空间的user_src_ptr中写入0x77 ,在用户空间中写入0x77 ,在KERNEL空间中写入0x77 […]

SIGBUS,同时从minmap中确定的RAM中的mmap ed缓冲区执行memcpy

我正在拼图块: mapAddr = mmap((void*) 0, curMapSize, PROT_NONE, MAP_LOCKED|MAP_SHARED, fd, curMapOffset); 如果这不失败(mapAddr != MAP_FAILED)我查询mincore为: err = mincore((char*) mapAddr, pageSize, &mincoreRet); 找出是否在RAM中。 如果它在RAM(err == 0 && mincoreRet&0x01),我再次映射它读取作为: copyAddr = mmap((void*) 0, curMapSize, PROT_READ, MAP_LOCKED|MAP_SHARED, fd, curMapOffset); 然后我尝试将其复制到我的缓冲区中,如下所示: memcpy(data, copyAddr, pageSize); 一切工作正常,除了在最后一个memcpy一次,我得到了SIGBUS。 当我检查/ proc / / smaps在失败的时候,我注意到它有Rss以及locking字段为0,如下所示: 7f4a4c118000-7f4a4c119000 r–s 00326000 00:17 6 <file name> Size: 4 kB Rss: […]

mmap是否与所有进程共享内存?

当我这样做: myProgram.h myProgram.c struct PipeShm { // all my fields // more // … }; struct PipeShm myPipe = { /* initialization for all fields */ }; struct PipeShm * sharedPipe = &myPipe; void func() { sharedPipe = mmap (NULL, sizeof * sharedPipe, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0); } 当我mmap指针sharedPipe ,如果我从main()从myProgram代码调用任何方法,所有进程将共享共享与myPipe结构共享的内存? 或者每个新创build的孩子都会拥有一个新的myPipe ? […]

避免在用户和内核空间之间复制数据,反之亦然

我正在开发一个替代TCP / IP的并行计算的主动消息协议。 我的目标是减less数据包的延迟。 由于环境是一个局域网,我可以用更简单的协议replaceTCP / IP来减less数据包延迟。 我不写任何设备驱动程序,我只是想用简单的东西replaceTCP / IP堆栈。 现在我想避免将数据包的数据从用户空间复制到内核空间, 反之亦然 。 我听说过mmap()。 这是做这个最好的方法吗? 如果是的话,如果你能给出一些例子的链接将是很好的。 我是一个Linux新手,我真的很感激你的帮助..谢谢… 谢谢,巴拉

是否mremap“增长初始化”内存?

如果我mmap ()一些私人和匿名页面,然后用mremap ()扩展它们,新的空间是否也被初始化为零? 我试过在linux源代码中读取mremap( mm / mremap.c )的代码,但它需要一些我目前没有的领域特定的知识(vma _ ### stuff)。 甚至不知道这是正确的地方看… 但是,从我所收集到的,我认为 mremap ()ed内存将被清除,这是正确的吗? 分配是这样完成的 list = mmap(NULL, newSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) 然后重映像就这样完成了 newList = mremap(list, oldSize, newSize, MREMAP_MAYMOVE) 最后,这是一个特定于Linux的问题,运行最近的内核(> = 2.6.28)和libc(> = 2.11.1)

Linux:如何检查进程可用的最大连续地址范围

我想在命令行中inputpid,并取回未被保留的最大的连续地址空间。 有任何想法吗? 我们的32位应用程序运行在64位RHEL 5.4上,运行了一段时间,比如说24小时。 那个时候内存使用量只有2.5GB,但是内存出错了。 我们认为它无法映射大型文件,因为应用程序的内存空间是分散的。 我想出去到生产服务器,只是testing这个理论。