Я пытаюсь использовать sbrk
системный вызов, чтобы попросить одну страницу памяти и разделить эту страницу на небольшие блоки, но мой код всегда попадает какой-то недопустимое память:Почему я ударил недопустимую память после sbrk?
void sbrkBlocks() {
int *b = sbrk(0);
if(sbrk(sysconf(_SC_PAGESIZE)) == (void *)-1) {
printf("sbrk failed\n");
return NULL;
}
void *bound =b + sysconf(_SC_PAGESIZE);
while (b + 16 <=bound) {
*b = 1;
b+= 16;
}
}
Как если я sbrk(0)
на 0x804d000
, оценка после sbrk(one_page_size)
будет 0x8055000
, но код получит ошибку сегментации на 0x804e000
.
это для приложения или модуля ядра? –
Это для реализации malloc, я изменил свой фактический код, поэтому было бы легче подталкивать. –
В моей системе 'sysconf (_SC_PAGESIZE)' возвращает 4096, что, я думаю, довольно типично. Если у вас одно и то же, вы ошибочно выполнили свои связанные вычисления: для начального разрыва в '0x804d000' новый разрыв должен быть равен' 0x804e000', где вы получите segfault. –