【发布时间】:2021-04-03 00:16:34
【问题描述】:
根据我的教科书,我的问题正如蒂蒂所说的那样
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
那么这里发生了什么?
【问题讨论】:
-
is effectively rounded up不代表“会回来”,
标签: linux dynamic-memory-allocation sbrk