- 论坛徽章:
- 9
|
回复 7# mordorwww
这个分析很简单:
1. 实践派:写个程序,strace一下就行。调了什么系统调用,返回值得是多少,一清二楚。
2. 理论分析派:man 一下sbrk手册,写得很清楚,在Linux下,brk和sbrk库调用,都是使用brk系统调用的。
在linux系统调用中。如果传0,就代表返回当前堆顶(第一次调用时和堆底同值,可以由strace结果进行验证)。
以下的代码摘自2.6.34.10内核mm/mmap.c文件。
- SYSCALL_DEFINE1(brk, unsigned long, brk)
- {
- //<...>
- unsigned long min_brk;
- //<...>
- #ifdef CONFIG_COMPAT_BRK
- min_brk = mm->end_code;
- #else
- min_brk = mm->start_brk;
- #endif
- if (brk < min_brk)
- goto out;
- //<...>
- out:
- retval = mm->brk; //<--- 这就是内核管理的进程的栈顶!
- //<...>
- return retval;
- }
复制代码 |
|