2017-02-01 7 views
0

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

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

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

EDIT:

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

Вот моя структура. Тогда у меня есть FUNC, которые создать блок

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

Если вы '#include Olaf

+0

'stdlib.h', конечно, не включен –

+0

Откуда вы знаете? – Olaf

ответ

0

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

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

Маллки в своей простейшей реализации выделяет определенное количество пространства вида:

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

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

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

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

для получения дополнительной информации о различных реализациях таНоса см this answer , который использует ММАП, но точно так же может использовать sbrk

+0

"данные являются указателем на вторую часть выделенной зоны". Вот что я не понимаю, как вы можете найти указатель второй зоны. Если я хочу использовать 'malloc (10)', я сделаю 'sbrk (4096)' от 0x0000 до 0x4096 для примера, и я хочу взять часть этого выделенного пространства для моего malloc для примера 0x0000 - 0x0010, поэтому мой свободное пространство будет 0x0011 до 0x4096 после malloc –

+0

Если выделенное пространство равно 10, то следующая зона начинается с базы + 10, нет? – Adalcar

+0

В этом случае, если у меня есть размер 'size_t size = 10' и' void * data = 0x0000' (начало моего 'sbrk (4096)'), то выполнение 'void * new_end = data + size' не работает и Я не могу понять, почему –