【问题标题】:c malloc functionality for custom memory regionc malloc 自定义内存区域的功能
【发布时间】:2016-05-07 01:05:18
【问题描述】:

是否有任何类似 malloc/realloc/free 的实现,我可以指定一个内存区域来管理内存分配?

我的意思是常规 malloc(等)函数只管理堆内存区域。 如果我需要在共享内存段或内存映射文件中分配一些空间怎么办?

【问题讨论】:

  • “在共享内存段或内存映射文件中分配一些空间”是什么意思?您想使用malloc() 或类似函数来执行此操作吗?
  • 我认为您正在尝试做一些不会像您期望的那样工作的事情。共享内存区域通常映射到不同的地址,因此使用指向它们的指针是很棘手的。
  • 是的,我需要像 malloc/realloc/free 一样的功能,但是像这样:cust_malloc(struct* mem_region, size_t length) 等等。我知道 malloc 实现比 fir 看起来更复杂,它管理“格式化”堆内存,启动内核的 brk 调用(以获得更多内存或缩小)并处理并发内存分配。
  • 我想用来共享(或存储)没有指针但有计数数据的数据结构,如 wecbam 捕获的图像、PCM 样本、长字符串,它基本上是一个包含一些数据和 (线性)数组。

标签: c memory-management shared-memory gnu mmap


【解决方案1】:

不是 100 %,根据您的问题,您希望维护自己的内存区域。所以你需要自己去my_mallocmy_reallocmy_free

实现您自己的my_malloc 可能会对您有所帮助

void* my_malloc(int size)    
{
    char* ptr = malloc(size+sizeof(int));
    memcpy(ptr, &size, sizeof(int));
    return ptr+sizeof(int); 
}

这只是一个小想法,完整的实施将带您到 回答。

Refer this question

用同样的方法实现my_reallocmy_free

【讨论】:

  • 这很容易失败。 malloc() 需要返回一个适当对齐的值,以便可以将它分配给指向具有基本对齐要求的任何类型对象的指针... (7.22.3 Memory management functions) 偏移从返回的值malloc() by sizeof(int) 打破了这一要求。
【解决方案2】:

我最近也问过自己这个问题,因为我希望我的安全程序有一个 malloc 实现,它可以在退出前安全地清除静态内存区域(其中包含加密密钥、密码和其他此类数据等敏感数据)。

首先,我找到了this。我认为这对我的目的可能非常有用,但我真的无法完全理解它的代码。许可证状态也不清楚,因为它对我的一个项目也非常重要。

我最终写了my own。 我自己的实现同时支持多个堆,使用池描述符结构对它们进行操作,释放块的自动内存归零,未定义的行为和 OOM 处理程序,获取已分配对象的确切可用大小并测试仍然分配的指针,这非常足够为了我。速度不是很快,而且是教育级的,而不是专业级的,但我很急着想要一个。

请注意,它(还)不知道对齐要求,但至少它返回一个适合存储 32 位整数的地址。

【讨论】:

    【解决方案3】:

    我正在使用任务,我可以将数据存储在特定的内存空间中。例如我可以使用:

    testVar _at(0x200000);
    

    我不确定这是否是您正在寻找的,但例如我正在使用它将数据存储到外部 RAM。但据我所知,它只适用于全局变量。

    【讨论】:

      【解决方案4】:

      实现自己的my_allocmy_free 并使用首选内存范围并不难。它是一个简单的链:块大小、空闲/正在使用的标志、块数据加上最终块标记(例如块大小 = 0)。一开始你有一个大的空闲块并且知道它的地址。注意my_alloc返回block数据的地址,block size/flag都是之前的几个字节。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        • 2012-05-07
        • 1970-01-01
        • 1970-01-01
        • 2013-05-22
        • 2018-08-29
        • 2010-11-27
        相关资源
        最近更新 更多