草庐IT

PACKET_MMAP

全部标签

c - 如何防止 MMAP 缓存值?

我编写了一个linux驱动程序,它ioremaps将特定设备的PCIBAR0导出到sysfs二进制属性,允许用户空间直接控制它。当我尝试在属性之上进行MMAP以直接访问该内存位(从用户态程序)时,问题就出现了。读取成功并返回预期值,但当我写入该内存时,它似乎缓存在内核和内存之间的某个位置,并且没有传送到GMCH根复合体(因此也传送到设备)。我想做的是在每次访问后有一个隐式的写内存屏障。有什么方法可以防止内核将写入缓存到mmap-ed内存位?跟进:正在调用msync()每次访问后以“接受”的方式执行此操作? 最佳答案 继续前进并用我的

linux - mmap'ed内存何时以及如何换入和换出?

以我的理解,mmap一个适合RAM的文件就像将文件放在内存中一样。假设我们有16G的RAM,我们首先mmap一个我们使用了一段时间的10G文件。这在访问方面应该是相当有效的。如果我们然后映射第二个10G文件,是否会导致第一个文件被换出?还是其中的一部分?如果是这样,这将在什么时候发生?在mmap调用时,还是在访问新加载文件的内存区域时?如果我们想再次访问第一个文件指针的内存,是否会再次加载交换文件?那么,假设我们在对应于第一个文件和第二个文件的内存之间交替读取,这会导致灾难性的性能吗?最后,如果以上任何一条为真,mmap几个较小的文件会更好吗? 最佳答案

c - 读写 mmap 的参数无效?

出于某种原因,我收到了-EINVAL,我不清楚原因。这是我打开并尝试mmap文件的位置:if((fd=open(argv[1],O_RDWR))编辑:我应该补充一点,错误发生在mmap中。 最佳答案 结果是将MAP_SHARED更改为MAP_PRIVATE可以成功。失败的原因很微妙:我的代码在VirtualBoxVM中运行,而我尝试mmap的文件位于主机上的共享目录中。VirtualBox虚拟文件系统显然没有在管理程序边界上使用MAP_SHARED选项实现mmap。如果您阅读jxh对我的问题和他的回答的有用评论,就会发现这段代码对他

Linux MMAP 内部结构

我有几个关于Linux系统中的mmap实现的问题,这些问题似乎没有太多记录:当使用mmap将文件映射到内存时,您将如何处理预取此类文件中的数据?即当您从mmaped区域读取数据时会发生什么?该数据是否已移至L1/L2缓存?它是直接从磁盘缓存中读取的吗?prefetchnta和类似的ASM指令是否适用于mmaped区域?实际mmap调用的开销是多少?它是相对于映射数据量还是常数?希望有人对此有所了解。提前致谢。 最佳答案 mmap基本上是对虚拟内存子系统的编程访问。当你有,比方说,1G文件,你mmap它,你会得到一个指向“整个”文件的

linux - 如何可移植地扩展使用 mmap() 访问的文件

我们正在试验改变SQLite,一个嵌入式数据库系统,使用mmap()而不是通常的read()和write()调用来访问磁盘上的数据库文件。对整个使用单个大映射文件。假设文件足够小,我们没有问题在虚拟内存中为此寻找空间。到目前为止一切顺利。在许多情况下,使用mmap()似乎更快一些比读()和写()。在某些情况下速度更快。调整映射大小以提交写事务扩展数据库文件似乎是一个问题。为了延长数据库文件,代码可以做这样的事情:ftruncate();//extendthedatabasefileondiskmunmap();//unmapthecurrentmapping(it'snowtoosma

mysql - ERROR 2013 (HY000) : Lost connection to MySQL server at 'reading authorization packet' , 系统错误:0

我收到以下错误ERROR2013(HY000):LostconnectiontoMySQLserverat'readingauthorizationpacket',systemerror:0尝试连接到我的MySQL服务器时。我在做什么:我在MySQL中有Master-Slave复制,它正在工作,只是使用F5添加了负载平衡功能。我已经根据他们的网站配置了F5。但是当我尝试使用F5配置的IP连接到我的MySQL服务器时,我得到了ERROR2013(HY000):LostconnectiontoMySQLserverat'readingauthorizationpacket',systeme

c - mmap的对齐和粒度

我对specificationofmmap感到困惑.设pa为mmap的返回地址(同规范)pa=mmap(addr,len,prot,flags,fildes,off);我认为函数调用成功后,以下范围是有效的[pa,pa+len)我的问题是以下范围是否仍然有效?[round_down(pa,pagesize),round_up(pa+len,pagesize))[base,base+size]forshort也就是说:base是否总是与页面边界对齐?size是否总是pagesize的倍数(粒度就是pagesize)?感谢您的帮助。我认为这一段暗示了:Theoffargumentiscon

c++ - 限制用于 mmap 的缓冲区缓存

我有一个数据结构,我想修改它以按需分页。mmap似乎是运行一些初始实验的简单方法。但是,我想限制mmap使用的缓冲区缓存量。机器有足够的内存将整个数据结构分页到缓存中,但出于测试原因(以及一些生产原因)我不想让它这样做。有没有办法限制mmap使用的缓冲区缓存量?或者,一个mmap替代方案也可以实现类似的功能,但仍会限制内存使用。 最佳答案 据我了解,这是不可能的。内存映射由操作系统控制。内核将决定如何以最佳方式使用可用内存,但它会综合考虑系统。我不知道是否支持进程级别的缓存配额(至少,我没有在Linux或BSD中看到此类API)。有

c++ - 为什么在 32 位 armv7l 上 mmap 4GB 文件成功?

我从mmap(2)手册页和搜索结果中得到的印象是,mmap只限于系统可用的地址空间,减去系统保留的地址空间.所以在32位armv7l上,我假设它大约是3GB=(4GB-1GB)。但似乎我实际上可以mmap一个5GB的文件而没有任何问题:intmain(intargc,char**argv){//statschar*path=argv[1];structstatsb;stat(path,&sb);std::cout使用-D_FILE_OFFSET_BITS=64标志编译:g++-D_FILE_OFFSET_BITS=64test.cc结果产生:Filesize:5045966585Fil

c - mmap 物理连续内存

我在这里可能有一些误解,请耐心等待。我编写了一个从相机捕捉图像的程序。正如我在V4L2documentation中找到的那样,我正在使用mmap在相机和我的应用程序之间共享内存。.这很好用。现在我的处理器(它是TI的DM3730)也有一个DSP。我想使用DSP,但它需要物理连续内存。TI提供驱动程序来分配内存。我的问题是,现在我浪费了很多时间来将映射的内存复制到物理连续内存中。有没有办法告诉mmap它不应该自己分配内存,而是告诉mmap使用我分配的内存。为了让您了解我在做什么(当然缺少很多代码,但我非常接近V4L2文档。我希望这足以理解我的问题)://reservephysicalco