草庐IT

PACKET_MMAP

全部标签

通过mmap分配的内存是否可以覆盖数据段

malloc函数同时使用了sbrk和mmap函数。现在sbrk函数增加或减少数据段。所以它是线性增长的。现在我的问题是,这种线性是否始终保持不变,或者例如,mmap调用可以分配与数据段重叠的内存?我说的是在多核系统上运行的多线程程序。Thisblog讨论了sbrk用于多线程程序的一些严重缺陷,并指出使用sbrk分配的内存可能会与使用mmap(sbrk堆可能变得不连续,因为mmaped区域或共享对象阻碍了堆的增长)。 最佳答案 那篇博文只见树木不见森林;只有malloc实现被允许使用非零参数调用sbrk。更准确地说,如果应用程序代码使

linux - mmap 与 malloc : strange performance

我正在编写一些解析日志文件的代码,需要注意的是这些文件是压缩的,必须即时解压缩。这段代码对性能有些敏感,所以我正在尝试各种方法来找到正确的代码。无论我使用多少个线程,我基本上都拥有程序所需的RAM。我发现了一种似乎表现相当不错的方法,并且我正在尝试了解它提供更好性能的原因。这两种方法都有一个读取器线程,一个从管道gzip进程读取并写入一个大缓冲区。然后在请求下一个日志行时延迟解析此缓冲区,返回本质上是指向缓冲区中不同字段所在位置的指针结构。代码在D中,但它与C或C++非常相似。共享变量:shared(bool)_stream_empty=false;;shared(ulong)uppe

c - 如何解决从 mmap() 返回的字符串中缺少 NUL 终止符的问题?

当mmap()ing一个文本文件时,像这样intfd=open("file.txt",O_RDWR);fstat(fd,&sb)char*text=mmap(0,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);文件内容直接映射到内存中,text它不会包含NUL终止符,因此使用普通字符串函数对其进行操作是不安全的。在Linux上(至少)未使用页面的剩余字节用零填充,因此在文件大小不是页面大小的倍数的所有情况下,您都有效地获得了一个NUL终止符。但是依赖它感觉很脏,而且其他mmap()实现(例如,我认为在FreeBSD中)不会对部分页面进行零填充。页面大小的倍

c++ - mmap + madvise 真的是异步 I/O 的一种形式吗?

我试图弄清楚mmap是否正在处理一个文件,然后使用madvise()或posix_madvise()和MADV_WILLNEED/POSIX_MADV_WILLNEED实际上会触发后台异步I/O以进行预读。manpagesformadvise不要具体说明是否是这种情况-madvise的实际行为大多不清楚,以便实现灵活的实现。但是当madvise()和MADV_WILLNEED被调用时,任何实际的主流POSIX实现(如Linux)是否真的执行异步文件I/O?我似乎无法获得有关此的任何可靠信息。Thisquestion至少在Linux上表明它确实如此,即使它并不理想,因为没有回调机制。这b

c - dma_mmap_coherent 和 remap_pfn_range 有什么区别?

目前,我正在使用exampledriver从中学习,并从中建立了自己的自定义驱动程序。mmap代码几乎完全相同,除了我允许用户管理他们自己请求的大小并以此为基础进行内存分配,以及我在/dev中自动创建字符设备这一事实。为了解释上下文,对于我的用例,我想缩小我遇到的问题的范围。dma_mmap_coherent在使用kmalloc内存时可测试地工作,但是当我有一个保留的物理地址区域时,我想使用remap_pfn_range似乎安静地工作,并且dmesg不报告任何错误,但是当我去阅读,无论我在那里写了什么,它总是返回0xff字节。无论我是在ioremap内存之后在内核态中使用iowrite

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来完成吗?如果我想使用任何