gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:32:36 27 4
gpt4 key购买 nike

我知道使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com