Я стараюсь писать очень простые буквы, чтобы лучше понять основные принципы. И мне нужно реализовать malloc-пространство пользователя. Поэтому сначала я хочу реализовать и протестировать его на моей Linux-машине.Почему моя реализация системного вызова sbrk не работает?
Сначала я реализовал функцию sbrk() следующим образом
void* sbrk(int increment) {
return (void*)syscall(__NR_brk, increment);
}
Но этот код не работает. Вместо этого, когда я использую sbrk, данный os, это работает отлично.
я судимое использовать другую реализацию sbrk()
static void *sbrk(signed increment)
{
size_t newbrk;
static size_t oldbrk = 0;
static size_t curbrk = 0;
if (oldbrk == 0)
curbrk = oldbrk = brk(0);
if (increment == 0)
return (void *) curbrk;
newbrk = curbrk + increment;
if (brk(newbrk) == curbrk)
return (void *) -1;
oldbrk = curbrk;
curbrk = newbrk;
return (void *) oldbrk;
}
sbrk вызывается из этой функции
static Header *morecore(unsigned nu)
{
char *cp;
Header *up;
if (nu < NALLOC)
nu = NALLOC;
cp = sbrk(nu * sizeof(Header));
if (cp == (char *) -1)
return NULL;
up = (Header *) cp;
up->s.size = nu; // ***Segmentation fault
free((void *)(up + 1));
return freep;
}
Этот код также не работает, на линии (***) Я получаю ошибку сегментации. Где проблема?
Спасибо всем. Я решил проблему, используя новую реализацию sbrk. Данный код работает отлично.
void* __sbrk__(intptr_t increment)
{
void *new, *old = (void *)syscall(__NR_brk, 0);
new = (void *)syscall(__NR_brk, ((uintptr_t)old) + increment);
return (((uintptr_t)new) == (((uintptr_t)old) + increment)) ? old :
(void *)-1;
}
Интересный вопрос, но вы, вероятно, должны расшириться на «не работает». – Tyler
Я упомянул причину проблемы.См. Выше. –
Почему вы пытаетесь «эмулировать» системный стол, например 'sbrk'? Вы должны изменить свой вопрос, чтобы мотивировать это. –