草庐IT

c - 如果禁用 ASLR,mmap 是否具有确定性?

如果地址空间布局随机化(ASLR)被禁用,我们会得到一个确定性的mmap吗?所谓确定性,我的意思是如果我使用相同的输入一次又一次地运行相同的应用程序,我会得到mmap返回的相同地址吗?我对匿名mmap最感兴趣。 最佳答案 IfAddressSpaceLayoutRandomization(ASLR)isdisabled,wouldwehaveadeterministicmmap?如果您的应用程序在第i个mmap时刻具有完全相同的内存布局(根据虚拟地址空间的哪些页面被映射,哪些没有映射);那么mmap在Linux内核中应该是确定性的。

linux - 对共享内存对象进行 ben mmap 后,ftruncate 是否安全?

shm_open()mmap()具有预定义的大长度fork()(多次)ftruncate()随意这样做的目的是确保fork()生成的每个进程在同一地址都有一个共享段。然而,我不想让RAM一直忙碌,而是动态调整它的大小(大小跨越0-大length)。这行得通吗?有UB吗? 最佳答案 不,没关系。您可以随时截断底层文件,但如果您访问超出文件范围的内存,您可能会收到SIGBUS。因此,您需要格外小心,不要触及超过文件当前长度的内存(或捕​​获SIGBUS并处理它)。来自man2mmap:Useofamappedregioncanresul

windows - mmap 的便携性如何?

我一直在考虑使用mmap来读取文件,并且想知道它的可移植性如何。我正在Linux平台上进行开发,但希望我的程序能够在MacOSX和Windows上运行。我可以假设mmap在这些平台上工作吗? 最佳答案 mmap()函数是一个POSIX调用。它在MacOSX(以及Linux、HP-UX、AIX和Solaris)上运行良好。问题区域将是Windows。我不确定POSIX“兼容性”子系统中是否有_mmap()调用。它很可能在那里——但名称带有前导下划线,因为Microsoft对namespace有另一种看法,并认为mmap()会侵入用户n

linux - 将 -1 作为文件描述符传递给 mmap

我在FC17Linux中对“ls”命令进行了跟踪。输出如下。execve("/usr/bin/ls",["ls"],[/*48vars*/])=0brk(0)=0x27c1000mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0)=0x7fc765fa6000...我没有得到将-1作为文件描述符传递给mmap调用的目的和结果,有人可以阐明这一点吗? 最佳答案 有两种映射(映射到进程的虚拟内存区域):文件支持映射和匿名(非文件支持)映射。有两种方法可以请

c - 带有 MAP_NORESERVE 的 mmap 是否保留物理内存?

mmap文档说明了关于标志MAP_NORESERVE的以下信息。Donotreserveswapspaceforthismapping.Whenswapspaceisreserved,onehastheguaranteethatitispossibletomodifythemapping.WhenswapspaceisnotreservedonemightgetSIGSEGVuponawriteifnophysicalmemoryisavailable.我实际上想要的是只保留虚拟内存地址,而不分配实际的物理内存。这可以用带有MAP_NORESERVE的mmap来完成吗?如果我想使用任何

c++ - 快速调整 mmap 文件的大小

我需要一个非常大的mmap文件的无拷贝重新调整大小,同时仍然允许对读取器线程的并发访问。简单的方法是在同一个进程中对同一个文件使用两个MAP_SHARED映射(增长文件,然后创建包含增长区域的第二个映射),然后在所有可以访问它的读取器都被访问后取消映射旧映射完成的。但是,我很好奇下面的方案是否可行,如果可行,它有什么优势。使用MAP_PRIVATE映射一个文件在多个线程中对该内存进行只读访问要么获取文件的互斥锁,要么写入内存(假设这样做的方式是,可能正在读取该内存的读者不会被它弄乱)或获取互斥量,但增加文件的大小并使用mremap将其移动到新地址(调整映射大小而无需复制或不必要的文件I

c - mmap on/proc/pid/mem

有没有人成功地用Linux内核2.6映射/proc/pid/mem文件?我收到ENODEV(无此类设备)错误。我的电话看起来像这样:char*map=mmap(NULL,PAGE_SIZE,PROT_READ,MAP_SHARED,mem_fd,offset);而且我在调试时通过查看/proc/pid/maps文件进行了验证,当执行到此调用时,offset的值为堆栈顶部减去PAGE_SIZE。我还使用ptrace验证了mmap将errno设置为ENODEV。 最佳答案 参见proc_mem_operationsin/usr/src/

c - 是否可以通过 mmap 匿名内存访问 "punch holes"?

考虑一个使用大量页面大小的内存区域(比如64kB左右)的程序,每个内存区域的生命周期都相当短。(在我的特定情况下,这些是绿色线程的备用堆栈。)如何最好地分配这些区域,以便在该区域不再使用时可以将它们的页面返回给内核?天真的解决方案显然是简单地mmap每个区域,并在完成后立即再次munmap它们。不过,我觉得这是个坏主意,因为它们太多了。我怀疑VMM可能会在一段时间后开始严重扩展;但即使不是,我仍然对理论案例感兴趣。如果我只是mmap我自己一个巨大的匿名映射,我从中按需分配区域,有没有办法通过该映射为我完成的区域“打洞”?有点像madvise(MADV_DONTNEED),但不同之处在于

c++ - Shmem vs tmpfs vs mmap

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。有人知道以下3个在速度方面的比较吗:共享内存tmpfs(/dev/shm)mmap(/dev/shm)谢谢!

c - 如何为 mmap 选择固定地址?

mmap()可以选择性地提供固定位置来放置map。我想映射一个文件,然后在每个程序的相同虚拟地址上将其提供给几个不同的程序。我不在乎地址是什么,只要他们都使用相同的地址即可。如果需要,地址可以由其中之一在运行时选择(并通过其他方式与其他人通信)。Linux是否保证我可以映射到未使用(由应用程序和内核)的内存区域?我怎样才能找到一个在多个正在运行的应用程序中可用的地址? 最佳答案 不是真的,不是。由于现代Linux系统上的地址空间随机化,因此很难保证可以使用或不可以使用哪些地址。此外,如果您正在考虑使用MAP_FIXED,请注意您需要