加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

如何分配页面大小对齐的内存?

发布时间:2020-12-13 19:28:22 所属栏目:Linux 来源:网络整理
导读:我需要分配应该页面大小对齐的内存.我需要将此内存传递给ASM代码,该代码计算所有数据块的xor.我需要用malloc()来做这个. 最佳答案 您应该使用这些功能. 如果不能,无论出于何种原因,通常这样做的方法是将块大小添加到分配大小,然后使用整数数学技巧来舍入指针

我需要分配应该页面大小对齐的内存.我需要将此内存传递给ASM代码,该代码计算所有数据块的xor.我需要用malloc()来做这个.

最佳答案
您应该使用这些功能.

如果不能,无论出于何种原因,通常这样做的方法是将块大小添加到分配大小,然后使用整数数学技巧来舍入指针.

像这样的东西:

/* Note that alignment must be a power of two. */
void * allocate_aligned(size_t size,size_t alignment)
{
  const size_t mask = alignment - 1;
  const uintptr_t mem = (uintptr_t) malloc(size + alignment);
  return (void *) ((mem + mask) & ~mask);
}

这还没有经过深刻的测试,但你明白了.

请注意,以后找出正确指向free()内存的指针变得不可能.要解决这个问题,我们必须添加一些额外的机制:

typedef struct {
  void *aligned;
} AlignedMemory;

AlignedMemory * allocate_aligned2(size_t size,size_t alignment)
{
  const size_t mask = alignment - 1;
  AlignedMemory *am = malloc(sizeof *am + size + alignment);
  am->aligned = (void *) ((((uintptr_t) (am + 1)) + mask) & ~mask);
  return am;
}

这会稍微包装指针技巧,并为您提供一个可以free()的指针,但是您需要取消引用对齐的指针以获得正确对齐的指针.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读