2017-02-01 3 views
0

spliting die malloc Funktion neu zu kodieren, kann ich ein sbrk(stack) wo:eine sbrk in 2

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

ich malloc immer mehr als ich brauche dann möchte ich einen Teil dieser zugewiesenen Bereich der Größe nehmen size und es zurückgeben , und wenn ich noch ein malloc machen will, nachdem ich bereits Speicher reserviert habe, muss ich nicht mehrere Aufrufe von sbrk machen. Wie kann ich das tun, ich habe versucht, mit brk(start_of_the_allocated_space), sbrk(size) zurückzugehen, um den Anfang und das Ende des Raumes zu haben, den ich brauche, aber es segfault.

EDIT:

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

Hier meine Struktur ist. Dann habe ich eine func, die ein Block

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

verwenden genauso gut können, wenn Sie '# include Olaf

+0

'stdlib.h' ist natürlich nicht enthalten –

+0

Woher weißt du das? – Olaf

Antwort

0

erstellen Wenn ich verstehe Ihre Frage, Es scheint, dass Sie eine große sbrk() tun wollen und spaltete dann ein neues Stück jedes Mal wenn Sie malloc.

Die Idee ist gut wegen der Last, die sbrk auf Ihr Programm nimmt, aber es scheint, dass Sie etwas missverstehen, das malloc interessiert.

Malloc in seiner einfachsten Ausführung weist eine gewisse Menge an Raum wie folgt aussehen:

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

Daten ein Zeiger auf das zweite Teil der zugeordneten Zone zu sein, den tatsächlichen Raum enthält. Als nächstes folgt der Zeiger auf das Ende der zugewiesenen Zone.

Wenn Sie einen bestimmten Speicherplatz malloc erstellen, erstellen Sie diese Struktur und geben Sie den Datenzeiger zurück. Dann, um Sie freizugeben, müssen Sie nur den Wert "frei" auf 1 setzen.

Dies generiert eine verknüpfte Liste, die alle Ihre Daten und alle in Ihrer sbrk'd-Zone enthält.

für weitere Informationen auf verschiedenen malloc Implementierungen finden this answer die mmap verwendet, aber sbrk

+0

"Daten sind ein Zeiger auf den zweiten Teil der zugewiesenen Zone". Das ist, was ich nicht verstehe, wie Sie den Zeiger der zweiten Zone finden können. Wenn ich zu einem 'malloc (10)' will, mache ich ein 'sbrk (4096)' von 0x0000 zu 0x4096 für Beispiel, und ich möchte etwas von diesem zugeteilten Raum für mein malloc für Beispiel 0x0000 zu 0x0010 so mein nehmen Der freie Speicherplatz ist 0x0011 bis 0x4096 nach dem malloc –

+0

Wenn der zugewiesene Speicherplatz 10 ist, dann beginnt die nächste Zone an der Basis + 10, nein? – Adalcar

+0

In diesem Fall, wenn ich ein 'size_t size = 10' und ein' void * data = 0x0000' (Beginn von 'sbrk (4096)') habe, funktioniert 'void * new_end = data + size' nicht und Ich kann nicht herausfinden, warum –

Verwandte Themen