【问题标题】:Large physically contiguous memory area物理上连续的大内存区域
【发布时间】:2015-01-09 14:45:52
【问题描述】:

对于我的理学硕士。论文中,我必须对英特尔在其 CPU 中使用的散列函数进行逆向工程,以在 Sandy Bridge 和新一代的最后一级缓存片之间传播数据。为此,我正在 Linux 中开发一个应用程序,它需要一个物理上连续的内存区域来进行我的测试。这个想法是从这个区域读取数据,以便它们被缓存,探测旧数据是否已被驱逐(通过延迟措施或 LLC 未命中计数器),以便找到冲突的内存地址,最后通过比较这些冲突的地址来发现哈希函数. 研究人员已经在 Windows 中使用了相同的程序,并且证明有效。

为此,我需要分配一个必须很大(64 MB 或更大)且完全可缓存的区域,因此 TLB 中没有对 DMA 友好的选项。如何执行此分配?

为了完全控制分配(即,使其在物理上真正连续),我的想法是编写一个 Linux 模块,从用户空间导出一个设备并 mmap() 它,但我不知道如何在内核内部分配如此多的连续内存。 我听说过 Linux 连续内存分配器 (CMA),但我不知道它是如何工作的

【问题讨论】:

  • 您的应用程序在做什么?您希望测量结果有多可靠?请编辑您的问题以改进它!
  • 我认为 CMA 是你想要的。

标签: linux memory-management


【解决方案1】:

应用程序看不到物理内存,processvirtual memory 中有一些address space。阅读MMU (虚拟空间中连续的内容可能在物理上并不连续,反之亦然)

您可能希望使用mlock(2) 锁定一些内存

但是您的应用程序将被安排,其他进程(或安排的任务)会弄脏您的CPU cache。另见sched_setaffinity(2)

(甚至内核代码也可能被抢占)

【讨论】:

  • 这就是为什么我打算通过内核,大概是通过一个为应用程序分配内存区域的模块。我的测试是在受控的实验室环境中完成的,其中干扰保持最小(没有其他应用程序运行,核心上的测试棒等)。
  • 事情可能远没有你相信的那么简单!我相信您对正在运行的 PC 的实际复杂性(不确定性和不可重复性)没有一个很好的了解......(有或没有 Linux)
  • 我真的不知道。我更像是一个软件人而不是硬件人。但是当前的硬件是 non-deterministic 并且具有 non-reproducible behavior ;至少,测量几十次。编辑您的问题以解释更多您想要做什么。
【解决方案2】:

Kernel Newbies上的这个页面,有一些关于内存分配的想法。但是 get_free_pages 的最大值看起来像 8MiB。 (也许这是一个编译时约束?)

由于这将是全定制的,您可以探索 linux 内核的 mem= 引导参数。这将限制使用的内存量,并且您可以在任何人都不知道的情况下对剩余的内存进行派对。哎呀,如果你启动一个busybox系统,你可能会做mem=32M,但如果你不启动GUI,即使mem=256M也应该可以工作。

您还需要查看Offline Scheduler(和here)。它从 Linux 中“拔出” CPU,因此您可以完全控制在其上运行的所有代码。 (其中一些部分已经在主线内核中,也许全部都在。)

【讨论】:

    猜你喜欢
    • 2014-03-28
    • 2012-01-08
    • 1970-01-01
    • 2019-10-23
    • 2010-10-24
    • 2012-11-28
    • 2015-01-26
    • 2018-09-10
    • 2011-11-04
    相关资源
    最近更新 更多