【问题标题】: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) 返回的地址对于两者来说是不同的。您的程序如何以及为什么使用此信息超出了我的理解。

    【讨论】:

      猜你喜欢
      • 2021-01-09
      • 1970-01-01
      • 2019-09-10
      • 2015-11-24
      • 2011-10-15
      • 2022-06-22
      • 2011-06-06
      • 2019-09-12
      • 1970-01-01
      相关资源
      最近更新 更多