【问题标题】:who is calling the brk(NULL) and why?谁在调用 brk(NULL),为什么?
【发布时间】:2019-09-13 06:28:20
【问题描述】:
我编写了一个小型 hello world 程序,并在其二进制文件上运行 strace,它列出了所有已作为我的 Hello_world 程序执行的一部分调用的系统调用。
strace ./a.out
execve("./a.out", ["./a.out"], [/* 40 vars */]) = 0
brk(NULL) = 0xb7d000
brk(NULL) 用于查找当前 DSS 的上限,但我的问题是,谁想知道这个,为什么?
edit1:我的程序中没有malloc
【问题讨论】:
标签:
linux
system-calls
brk
【解决方案1】:
很有可能,无论您是否使用malloc(),C 运行时库都会准备堆。为此,它会查询 DSS 的当前大小并适当地设置控制结构,以便能够在调用第一个 malloc() 时立即采取行动。
【解决方案2】:
我写这篇文章是为了回答,因为我没有足够的声誉来发表评论。也就是说,我建议您查看this,尤其是this 的答案。
简而言之,当您执行程序时,正在运行的进程(在您的情况下为 shell)需要调用 fork() 以通过复制自身来创建新进程。这个重复的进程,一个“子”进程,然后调用 execve()(这是 strace 列出的第一个系统调用),它有效地覆盖了调用(“父”)进程的文本、数据、bss 和堆栈。重要的是,在调用 fork() 之前可能已经动态分配给父进程的内存不会被保留。因此, brk(NULL) 返回的地址对于两者来说是不同的。您的程序如何以及为什么使用此信息超出了我的理解。