繁体   English   中英

大的物理连续存储区

[英]Large physically contiguous memory area

对于我的硕士 论文中,我必须对Intel内部在CPU中使用的哈希函数进行反向工程,以在Sandy Bridge和更新一代中的Last Level Cache片之间分配数据。 为此,我正在Linux中开发一个应用程序,该应用程序需要一个物理上连续的内存区域才能进行测试。 想法是从该区域读取数据,以便对其进行缓存,探查是否已清除较旧的数据(通过延迟措施或LLC未命中计数器),以查找冲突的内存地址,并最终通过比较这些冲突的地址来发现哈希函数。 研究人员已经在Windows中使用了相同的步骤,并且证明该步骤有效。

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

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

应用程序看不到物理内存, 进程虚拟内存 有一些地址空间 阅读有关MMU的信息 (在虚拟空间中什么是连续的,在物理上可能并不是真正连续的,反之亦然)

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

但是您的应用程序将被调度,并且其他进程(或调度的任务)将弄脏您的CPU缓存 另请参见sched_setaffinity(2)

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

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

由于这是完全自定义的,因此您可以探索linux内核的mem= boot参数。 这将限制使用的内存量,并且您可以在没有任何人知道的情况下共享剩余的所有内存。 哎呀,如果您启动一个busybox系统,您可能可以执行mem=32M ,但是如果您不启动GUI,那么即使mem=256M应该可以工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM