【问题标题】:splitting an sbrk into 2将 sbrk 拆分为 2
【发布时间】:2017-02-01 13:16:32
【问题描述】:

要重新编码 malloc 函数,我执行 sbrk(stack) where :

void *malloc(size_t size)
{
  stack = 0;
  while (stack < size)
    stack += 4096;
}

我的 malloc 总是比我需要的多,然后我想取一些分配的大小为 size 的区域并返回它,如果我想在我已经分配内存之后再做一次 malloc,所以我不必做多个sbrk 的呼唤。 我该怎么做,我试着用 brk(start_of_the_allocated_space)sbrk(size) 返回我需要的空间的开始和结束,但它是段错误。

编辑:

struct s_block {
size_t size;
struct s_block *next;
struct s_block *prev;
void *start;
void *end;
}

这是我的结构。 然后我有一个创建块的函数

struct s_block   *create_block(size_t size, unsigned int stack)
{
struct s_block *block;
block = sbrk(sizeof(s_block));
block->start = sbrk(stack);
block->size = stack;
block->end = sbrk(0);
block->next = set_free_space(size, block);
block->size -= size;
block->next->prev = block;
block->prev = NULL;
return (block->next);
}

struct s_block *set_free_space(size_t size, struct s_block *block)
{ 
struct s_block new_block;
new_block = sbrk(sizeof(s_block));
new_block->start = block->start;
new_block->next = NULL;
new_block->size = size;
new_block->end = ???; // this is where I want to split the first sbrk
// I tried new_block->end = new_block->start + size; but it doesn't work either
block->start = new_block->end + 1; // and i set the new start of the big block at the end of the one i use
return (new_block);
}

【问题讨论】:

  • 如果你#include &lt;stdlib.h,名称malloc是保留的,不能被用户代码使用。使用不同的名称。
  • stdlib.h 当然不包括在内
  • 因为我的程序中没有包含它。
  • 1) 正确的大写字母使阅读帖子更容易。是“我”,不是“我”。拼写错误并不酷。类似于使用降价 2) 没有包括它 - 确定不是间接的吗?并确定它没有链接?请参阅How to Ask,提供minimal reproducible example 和所有相关信息。
  • 这个代码段没有头没有尾,你能显示完整的功能吗?如果我们不知道您在问什么,我们将无法回答问题。

标签: c malloc sbrk brk


【解决方案1】:

如果我理解你的问题,看来你想做一个大的 sbrk() 然后每次你 malloc 分割一个新的部分。

这个想法很好,因为 sbrk 对您的程序承担了负载,但您似乎误解了一些关于 malloc 的内容。

Malloc 在其最简单的实现中分配一定数量的空间,如下所示:

struct metadata
{
   size_t size;
   int free;
   struct metadata *next;
   void *data; 
}

data 是指向分配区域第二部分的指针,包含实际空间。 next 是指向分配区域末尾的指针。

当你malloc某个空间时,你创建这个结构并返回数据指针。 然后,要释放,您只需将“免费”值设置为 1。

这会生成一个链接列表,其中包含您的所有数据,以及您的 sbrk 区域中的所有数据。

有关不同 malloc 实现的更多信息,请参阅this answer 它使用 mmap 但也可以使用 sbrk

【讨论】:

  • “数据是指向分配区域第二部分的指针”。这就是我不明白如何找到第二个区域的指针。如果我想要一个malloc(10),我会从0x0000到0x4096做一个sbrk(4096),例如,我想为我的malloc占用一些分配的空间,例如0x0000到0x0010,所以我的可用空间将是0x0011到malloc后的0x4096
  • 如果分配的空间是10,那么下一个zone从base+10开始,不是吗?
  • 在这种情况下,如果我有一个 size_t size = 10 和一个 void *data = 0x0000 (我的 sbrk(4096) 的开始),则 void *new_end = data + size 不起作用,我不知道为什么跨度>
  • 这可能是由于指针类型:void* 不能用于算术,因为它的大小是未知的
  • 我怎么不能在开始时设置我的 new_end + 我想要 malloc 的大小呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多