我的问题正如tilte所说,根据我的教科书
int brk(void *end_data_segment);
brk() 系统调用将程序中断设置为 end_data_segment 指定的位置。由于虚拟内存是以页面为单位分配的,因此 end_data_segment 有效地向上舍入到下一个页面边界。
并且由于在 Linux 上, sbrk() 被实现为使用 brk() 系统调用的库函数,所以我希望这两个函数都会将程序中断舍入到下一页边界。但是当我在 x86_64 Linux 机器(ubuntu)上进行测试时,事实证明这两个函数都将程序中断移动到所要求的确切位置(我尝试使用 brk,结果是相同的)。
int main(int argc, char *argv[])
{
void *ori = sbrk(100);
printf("original program break at %p\n", ori);
void *now = sbrk(0);
printf("program break now at %p\n", now);
return 0;
}
这是输出
original program break at 0x56491e28f000
program break now at 0x56491e28f064
那么这里发生了什么?