大的物理连续内存区域

时间:2015-01-09 14:45:53

标签: linux memory-management

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

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

要完全控制分配(即,它实际上是连续的),我的想法是编写一个Linux模块,从用户空间导出设备和mmap(),但我不知道如何在内核中分配如此多的连续内存。 我听说过Linux Contiguous Memory Allocator(CMA),但我不知道它是如何工作的

2 个答案:

答案 0 :(得分:1)

应用程序看不到物理内存,processaddress space中有一些virtual memory。阅读MMU(虚拟空间中连续的内容可能不是真正连续的,反之亦然)

您可能想要使用mlock(2)

锁定一些内存

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

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

答案 1 :(得分:1)

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

由于这将是全自定义的,您可以探索linux内核的mem=启动参数。这将限制使用的内存量,您可以在没有人知道的情况下聚集剩余的内存。哎呀,如果你启动一个busybox系统,你可能会mem=32M,但如果你没有启动GUI,即使是mem=256M也应该有效。

您还需要查看Offline Scheduler(和here)。它"拔掉"来自Linux的CPU,因此您可以完全控制在其上运行的所有代码。 (这部分内容已经在主线内核中,也许全部都是。)