【发布时间】:2014-02-21 18:29:07
【问题描述】:
我正在玩我写的一个简单的缓存模拟器,我想知道是否可以通过 Linux 手动分配一个虚拟页面,以便我可以测试方式冲突。
我知道这是值得怀疑的,甚至可能在 Linux 的设计中都没有考虑过,而且以不同的方式测试它显然更容易(只是为地址传递一个值),但我只是想我会抛出这个问题出于我自己的好奇心。
我会有类似的东西:
char *p1 = (char *)SomeLiteral;
*p1 = value1;
dcache.writeback(p1);
char *p2 = (char *)ADifferentLiteral;
*p2 = value2;
//may map to same set index and be brought to second way
dcache.writeback(p2);
这可能适用于某些嵌入式系统,但在 Linux 下显然会出现页面错误。那么,有没有办法为 p1 和 p2 分配一个虚拟页面呢?或者甚至为程序的堆设置虚拟地址?
如果这听起来很迟钝,我深表歉意,谢谢!
【问题讨论】:
-
@BasileStarynkevitch 这对他有什么帮助?似乎他想要避免页面错误,而这样做的方法是触摸每个页面以强制将物理内存分配给虚拟页面。
-
另见madvise(2) & mlock(2)
-
如果你 mmap() 一个文件,并且没有太大的内存压力(你有空闲内存可用),内容存储在一个称为页面缓存的内核数据结构中,并且不会命中实际媒体(直到 munmap() 或 msync())。您可以多次 mmap() 一个文件,从而获得基本相同物理 RAM 的新虚拟地址。使用
MAP_NORESERVEmmap() 标志来避免为映射保留交换。您可以使用 mlock() 来确保页面保留在 RAM(页面缓存)中,或者使用 madvise() 来请求(不保证,只是意图)或请求将它们逐出。使用 msync() 更新文件内容。
标签: c linux memory-management operating-system