c - 分配连续物理内存的方法

标签 c memory

我知道使用 C malloc 和 posix_memaligh 可以从进程的虚拟地址空间分配连续的内存。但是,我想知道是否可以以某种方式分配一个物理上连续的内存缓冲区?我正在调查利用 L2 缓存的侧信道攻击,因此我想确保我可以访问正确的缓存行。

最佳答案

连续内存的最好和最简单的方法是从系统请求一个“大”页面。它们的可用性取决于您的 CPU 和内核选项(在 x86_64 上,2MB 大页面通常可用,一些 CPU 也可以处理 1GB 页面;其他架构可以比这更灵活)。查看 /proc/meminfo 中的 Hugepagesize 字段,了解您设置中大页面的大小。

可以通过两种方式访问​​:

  1. 通过 MAP_HUGETLB 标志传递给 mmap()。这样就可以确定这个“巨大”的虚拟页面对应的是一个连续的物理内存范围。不幸的是,内核是否可以为您提供“大”页面取决于许多因素(内存使用的当前布局、内核选项等 - 另请参阅 hugepages 内核引导参数)。

  2. 通过映射来自专用 HugeTLB 文件系统的文件(参见此处:http://lwn.net/Articles/375096/)。使用 HugeTLB 文件系统,您可以提前配置可用大页面的数量,以确保必要数量的大页面可用。

另一种方法是编写一个内核模块,它将在内核端分配连续的物理内存,然后根据请求将其映射到进程的地址空间。这种方法有时用于嵌入式系统中的专用硬件。当然,仍然不能保证内核端内存分配器能够提供适当大小的连续物理地址范围,因此在某些情况下,此类地址范围会在启动时预先保留(一种愚蠢的方法是通过 max_addr 在启动时将参数传递给内核,以使一些 RAM 超出内核的范围。

关于c - 分配连续物理内存的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27172159/

相关文章:

c - 关于使用 SIGKILL 的说明

c - C内存读写BMP文件错误

ios - MapBox 导致由于内存问题而终止

c - 从信号处理程序返回并使信号屏蔽

c - 函数 printf() 的问题

c - 在 C 中有一些内存泄漏

xcode - 在 Cocoa 中一般分配内存的安全方法将自动释放

iphone - 如何使用元素解析器解析 div 深处的 <img>?

java - Object.toString 或 Object.hashCode 是否给出了对象的内存地址

c++ - 在不损失 C++ 速度的情况下改进元组映射的内存消耗