2017-02-01 1 views
0

내로는 sbrk를 spliting, 내가 않는 sbrk(stack) : 나는 내가 크기 size이 할당 된 영역의 일부를 가지고 그것을 반환 할 다음 필요한 것보다 항상 더 malloc에 ​​malloc이 함수를 코딩하기 위해 2

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

, 그리고 이미 메모리를 할당 한 후에 다른 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; 
} 

가 여기 내 구조입니다. 그럼 제가 질문을 이해한다면, 당신이 하나의 큰 sbrk()을하고 싶은 것하고 malloc에 ​​새로운 조각 매번 당신을 분할 한 블록을

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

을 만들 FUNC 있습니다.

로드 된 sbrk가 프로그램에 영향을 미쳤으므로 아이디어가 좋지만 malloc에 ​​대해 뭔가 오해 한 것 같습니다.

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

데이터는 실제 공간을 포함하는, 상기 할당 된 영역의 두 번째 부분을 가리키는 포인터 인 : 간단한 구현

MALLOC 이렇게보고의 일부 공간을 할당한다. 다음은 할당 된 영역의 끝을 가리키는 포인터입니다.

malloc 특정 공간이 있으면이 구조체를 만들고 데이터 포인터를 반환합니다. 그런 다음 자유롭게하려면 "무료"값을 1로 설정해야합니다.

이렇게하면 모든 데이터와 모든 sbrk'd 영역이 포함 된 링크 된 목록이 생성됩니다. 다른 malloc에 ​​구현에 대한 추가 정보를 원하시면

참조 this answer의 mmap를 사용하지만 단지뿐만 아니라는 sbrk에게

+0

"데이터는 할당 된 영역의 두 번째 부분에 대한 포인터입니다." 그게 내가 두 번째 영역의 포인터를 찾는 방법을 이해하지 못하는 이유입니다. 'malloc (10)'을 원한다면 0x0000에서 0x4096까지의'sbrk (4096)'을 exemple로 할 것이고,이 할당 된 공간 중 일부를 예제 0x0000에서 0x0010에 대한 myalloc에 ​​가져 가고 싶습니다. 여유 공간은 malloc 뒤에 0x0011에서 0x4096이 될 것입니다. –

+0

할당 된 공간이 10이면 다음 영역은 base + 10에서 시작합니다. – Adalcar

+0

이 경우'void * new_end = data + size'를 수행하는'size_t size = 10'과'void * data = 0x0000' (내'sbrk (4096)의 시작 부분)이 작동하지 않고 왜 –

관련 문제