我知道使用C malloc和posix_memaligh可以从进程的虚拟地址空间分配连续的内存。但是,我想知道是否可以分配物理连续内存的缓冲区?我正在调查利用L2缓存的侧通道攻击,所以我想确保我可以访问正确的缓存行..
答案 0 :(得分:3)
您对连续记忆的最佳和最简单的方法是从系统中请求一个“巨大”的页面。这些的可用性取决于您的CPU和内核选项(在x86_64上,通常可以使用2MB大页面,一些CPU也可以执行1GB页面;其他架构可以比这更灵活)。查看Hugepagesize
中的/proc/meminfo
字段,了解您设置中的大页面大小。
可以通过两种方式访问它们:
通过传递给MAP_HUGETLB
的{{1}}标记。这样,您可以确保“巨大”虚拟页面对应于连续的物理内存范围。不幸的是,内核是否可以为您提供“巨大”页面取决于许多因素(内存利用率的当前布局,内核选项等 - 也参见mmap()
内核启动参数)。
通过映射来自专用HugeTLB文件系统的文件(参见此处:http://lwn.net/Articles/375096/)。使用HugeTLB文件系统,您可以预先配置可用的大页面数量,以确保可以获得必要数量的大页面。
另一种方法是编写一个内核模块,它将在内核端分配连续的物理内存,然后根据请求将其映射到进程的地址空间。这种方法有时用于嵌入式系统中的专用硬件。当然,仍然无法保证内核端内存分配器能够提供适当大小的连续物理地址范围,因此在某些情况下这样的地址范围在引导时预先保留(一种愚蠢的方法是通过{{1在启动时将内核参数保留在内核的范围之内。
答案 1 :(得分:1)
On(几乎[注1])所有虚拟内存架构,虚拟内存以“页面”为单位映射到物理内存。页面的大小(几乎)总是2的幂,并且页面按该大小对齐,因为映射仅通过使用地址的高位来完成。看到页面大小为4K(12位地址)是很常见的,尽管现代CPU可以选择映射更大的页面以减小映射表的大小。
由于L2_CACHE_SIZE
通常也是2的幂并且将小于页面大小,因此任何单个对齐的大小L2_CACHE_SIZE
的分配必然位于单个页面中,因此对齐也将是物理上连续的。
因此,在这种特殊情况下,您可以放心,您分配的内存将是一个缓存行(至少在标准机器架构上)。
注1:毫无疑问,有些机器 - 可能是虚构的 - 不能以这种方式运作。但是你正在玩的那个不是其中之一。