【发布时间】:2015-01-09 14:45:52
【问题描述】:
对于我的理学硕士。论文中,我必须对英特尔在其 CPU 中使用的散列函数进行逆向工程,以在 Sandy Bridge 和新一代的最后一级缓存片之间传播数据。为此,我正在 Linux 中开发一个应用程序,它需要一个物理上连续的内存区域来进行我的测试。这个想法是从这个区域读取数据,以便它们被缓存,探测旧数据是否已被驱逐(通过延迟措施或 LLC 未命中计数器),以便找到冲突的内存地址,最后通过比较这些冲突的地址来发现哈希函数. 研究人员已经在 Windows 中使用了相同的程序,并且证明有效。
为此,我需要分配一个必须很大(64 MB 或更大)且完全可缓存的区域,因此 TLB 中没有对 DMA 友好的选项。如何执行此分配?
为了完全控制分配(即,使其在物理上真正连续),我的想法是编写一个 Linux 模块,从用户空间导出一个设备并 mmap() 它,但我不知道如何在内核内部分配如此多的连续内存。 我听说过 Linux 连续内存分配器 (CMA),但我不知道它是如何工作的
【问题讨论】:
-
您的应用程序在做什么?您希望测量结果有多可靠?请编辑您的问题以改进它!
-
我认为 CMA 是你想要的。