Расщепление sbrk на 2

Чтобы перекодировать функцию malloc, я делаю sbrk(stack) где:

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

Я всегда использую malloc больше, чем мне нужно, поэтому я хочу взять часть этой выделенной области размера size и вернуть его, и если я хочу сделать еще один malloc после того, как я уже выделил память, поэтому мне не нужно делать многократный вызов sbrk. Как я могу это сделать, я пытался вернуться с brk(start_of_the_allocated_space), sbrk(size) иметь начало и конец нужного мне места, но это segfault.

РЕДАКТИРОВАТЬ:

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);
}

1 ответ

Если я понимаю ваш вопрос, Кажется, вы хотите сделать один большой sbrk() а затем разбивать новый кусок каждый раз, когда вы malloc.

Идея хороша из-за нагрузки, которую sbrk берет на вашу программу, но кажется, что вы неправильно понимаете что-то вызывающее malloc.

Malloc в своей простейшей реализации выделяет определенное количество пространства, похожее на это:

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

данные являются указателем на вторую часть выделенной зоны, содержащую фактическое пространство. Далее указатель на конец выделенной зоны.

Когда ты malloc определенное пространство, вы создаете эту структуру и возвращаете указатель данных. Затем, чтобы освободить, вам просто нужно вернуть значение "бесплатно" в 1.

Это создаст связанный список, содержащий все ваши данные и все в вашей зоне sbrk'd.

для получения дополнительной информации о различных реализациях malloc, смотрите этот ответ, который использует mmap, но может также использовать sbrk

Другие вопросы по тегам