1

我正在尝试使用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.

4

2 回答 2

5

你做你的指针算术不正确。sysconf(_SC_PAGESIZE)返回页面的大小(以字节为单位)。添加 that b,它是指向 int 的指针,添加sizeof(int) * _SC_PAGESIZE到它。

运行这个:

int *b = sbrk(0);
printf("b = %p\n", b);
printf("PAGESIZE = %d\n", sysconf(_SC_PAGESIZE));
void *bound = b + sysconf(_SC_PAGESIZE);
printf("bound = %p\n", bound);
printf("bound - b = %d\n", (char *) bound - (char *) b);

你应该得到类似的东西:

b = 0x10c37d000
PAGESIZE = 4096
bound = 0x10c37e000
bound - b = 16384

你只是写了你实际分配的边界的末端。

于 2016-03-11T16:03:21.373 回答
1

请注意,在某些系统上,sbrk不会返回对齐的指针,您应该在调用后检查实际指针sbrk

#include <stdio.h>
#include <unistd.h>

int main(void) {
    int *l = sbrk(0);
    sbrk(getpagesize());
    int *u = sbrk(0);  // do this to get the actual aligned pointer
    //int *u = l + getpagesize(); // may fail, may not be accurate
    printf("l=%p, u=%p\n", l, u);
    while (l + 16 < u) {
       *l  = 1;
        l += 16;
        printf("l=%p\n", l);
    }
    return 0;
}
于 2016-03-11T16:00:26.597 回答