从Linux 编程接口:
int brk(void * end_data_segment );
系统调用将
brk()
程序中断设置为由 指定的位置end_data_segment
。由于虚拟内存是以页面为单位分配的,end_data_segment
因此有效地向上舍入到下一个页面边界。
所以对于这个演示:
#include <stdio.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
long int page_size = sysconf(_SC_PAGESIZE);
printf("My page size: %ld\n", page_size);
void* c1 = sbrk(0);
printf("program break address: %p\n", c1);
printf("sizeof char: %lu\n", sizeof(char));
c1 = (void*) ((char*) c1 + 1);
printf("c1: %p\n", c1);
brk(c1);
void* c2 = sbrk(0);
printf("program break address: %p\n", c2);
}
输出:
My page size: 4096
program break address: 0x55b0bc104000
sizeof char: 1
c1: 0x55b0bc104001
program break address: 0x55b0bc104001
我希望新的程序中断地址是:0x55b0bc104000 + 0x1000(4096 in HEX) == 0x55b0bc105000
为什么我没有得到0x55b0bc105000
,而是0x55b0bc104001
?