【问题标题】:Can you manually allocate virtual pages in Linux?你可以在 Linux 中手动分配虚拟页面吗?
【发布时间】: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 这对他有什么帮助?似乎他想要避免页面错误,而这样做的方法是触摸每个页面以强制将物理内存分配给虚拟页面。
  • 如果你 mmap() 一个文件,并且没有太大的内存压力(你有空闲内存可用),内容存储在一个称为页面缓存的内核数据结构中,并且不会命中实际媒体(直到 munmap() 或 msync())。您可以多次 mmap() 一个文件,从而获得基本相同物理 RAM 的新虚拟地址。使用MAP_NORESERVE mmap() 标志来避免为映射保留交换。您可以使用 mlock() 来确保页面保留在 RAM(页面缓存)中,或者使用 madvise() 来请求(不保证,只是意图)或请求将它们逐出。使用 msync() 更新文件内容。

标签: c linux memory-management operating-system


【解决方案1】:

如果您希望它分配物理页面,那么只需通过向其写入单个值来遍历并触摸每个页面。假设您需要预先分配 1024 个 4k 页,然后调用 malloc,然后以 4k 步遍历地址并在每个地址写入一个值。

【讨论】:

    猜你喜欢
    • 2016-05-11
    • 2020-02-19
    • 2014-12-26
    • 2018-01-10
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多