为什么我在 sbrk 之后会遇到无效内存?
Why do I hit invalid memory after 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;
}
}
就像我在 0x804d000
处得到 sbrk(0)
一样,sbrk(one_page_size)
之后的边界将是 0x8055000
,但是代码会在 [=16= 处出现分段错误].
请注意,在某些系统上,sbrk
不会 return 对齐指针,您应该在调用 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;
}
你的指针运算有误。 sysconf(_SC_PAGESIZE)
returns 页面大小 字节 。添加 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
您只是在超出您实际分配的边界的末端。
我正在尝试使用 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;
}
}
就像我在 0x804d000
处得到 sbrk(0)
一样,sbrk(one_page_size)
之后的边界将是 0x8055000
,但是代码会在 [=16= 处出现分段错误].
请注意,在某些系统上,sbrk
不会 return 对齐指针,您应该在调用 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;
}
你的指针运算有误。 sysconf(_SC_PAGESIZE)
returns 页面大小 字节 。添加 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
您只是在超出您实际分配的边界的末端。