谁在调用brk(NULL),为什么呢?

时间:2019-09-13 06:28:20

标签: linux system-calls brk

我编写了一个小的hello world程序,并在其二进制文件上运行strace,它列出了在执行Hello_world程序时已调用的所有系统调用。

strace ./a.out
execve("./a.out", ["./a.out"], [/* 40 vars */]) = 0
brk(NULL)                               = 0xb7d000

brk(NULL)用于查找当前DSS的上限,但是我的问题是,谁想知道这以及为什么?

edit1:我的程序中没有malloc

2 个答案:

答案 0 :(得分:1)

我将此作为答案,因为我没有足够的声誉来发表评论。也就是说,建议您查看this,尤其是this的答案。

简而言之,当您执行程序时,正在运行的进程(在您的情况下为shell)需要调用fork()通过复制自身来创建新进程。这个重复的过程是一个“子”过程,然后调用execve()(这是strace列出的第一个syscall),有效覆盖了调用(“父”)过程的文本,数据,bss和堆栈。重要的是,在调用fork()之前,可能已经动态分配给父进程的内存不会保留。因此,两者的brk(NULL)返回的地址将不同。我的程序无法理解您的程序如何以及为何使用此信息。

答案 1 :(得分:1)

无论您是否使用malloc(),C运行时库很可能都会准备堆。为此,它查询DSS的当前大小并适当地设置控制结构,以便能够在调用第一个malloc()时立即采取行动。

相关问题