- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux下进程地址空间的布局及堆栈帧的结构任何一个程序通常都包括
Linux下进程地址空间的布局及堆栈帧的结构
任何一个程序通常都包括代码段和数据段,这些代码和数据本身都是静态的。程序要想运行,首先要由操作系统负责为其创建进程,并在进程的虚拟地址空间中为其代码段和数据段建立映射。光有代码段和数据段是不够的,进程在运行过程中还要有其动态环境,其中最重要的就是堆栈。图3所示为 Linux下进程的地址空间布局:
图3 Linux下进程地址空间的布局
首先,execve(2)会负责为进程代码段和数据段建立映射,真正将代码段和数据段的内容读入内存是由系统的缺页异常处理程序按需完成的。另外,execve(2)还会将bss段清零,这就是为什么未赋初值的全局变量以及static变量其初值为零的原因。进程用户空间的最高位置是用来存放程序运行时的命令行参数及环境变量的,在这段地址空间的下方和bss段的上方还留有一个很大的空洞,而作为进程动态运行环境的堆栈和堆就栖身其中, 其中堆栈向下伸展,堆向上伸展。
知道了堆栈在进程地址空间中的位置,我们再来看一看堆栈中都存放了什么。相信读者对C语言中的函数这样的概念都已经很熟悉了,实际上堆栈中存放的就是与每个函数对应的堆栈帧。当函数调用发生时,新的堆栈帧被压入堆栈;当函数返回时,相应的堆栈帧从堆栈中弹出。典型的堆栈帧结构如图4所 示。
堆栈帧的顶部为函数的实参,下面是函数的返回地址以及前一个堆栈帧的指针,最下面是分配给函数的局部变量使用的空间。一个堆栈帧通常都有两个指针,其中一个称为堆栈帧指针,另一个称为栈顶指针。前者所指向的位置是固定的,而后者所指向的位置在函数的运行过程中可变。因此,在函数中访问实 参和局部变量时都是以堆栈帧指针为基址,再加上一个偏移。对照图4可知,实参的偏移为正,局部变量的偏移为负。
图4 典型的堆栈帧结构
介绍了堆栈帧的结构,我们再来看一下在Intel i386体系结构上堆栈帧是如何实现的。图5和图6分别是一个简单的C程序及其编译后生成的汇编程序。
图5 一个简单的C程序example1.c
int function(int a, int b, int c)
{
char buffer[14];
int sum;
sum = a + b + c;
return sum;
}
void main()
{
int i;
i = function(1,2,3);
} 图6 example1.c编译后生成的汇编程序example1.s
1 .file example1.c
2 .version 01.01
3 gcc2_compiled.:
4 .text
5 .align 4
6 .globl function
7 .type function,@function
8 function:
9 pushl %ebp
10 movl %esp,%ebp
11 subl $20,%esp
12 movl 8(%ebp),%eax
13 addl 12(%ebp),%eax
14 movl 16(%ebp),%edx
15 addl %eax,%edx
16 movl %edx,-20(%ebp)
17 movl -20(%ebp),%eax
18 jmp .L1
19 .align 4
20 .L1:
21 leave
22 ret
23 .Lfe1:
24 .size function,.Lfe1-function
25 .align 4
26 .globl main
27 .type main,@function
28 main:
29 pushl %ebp
30 movl %esp,%ebp
31 subl $4,%esp
32 pushl $3
33 pushl $2
34 pushl $1
35 call function
36 addl $12,%esp
37 movl %eax,%eax
38 movl %eax,-4(%ebp)
39 .L2:
40 leave
41 ret
42 .Lfe2:
43 .size main,.Lfe2-main
44 .ident GCC: (GNU) 2.7.2.3
这里我们着重关心一下与函数function对应的堆栈帧形成和销毁的过程。从图5中可以看到,function是在main中被调
您可能关注的文档
最近下载
- 季度查漏补种登记表.doc VIP
- GB50318-2017 城市排水工程规划规范.pdf VIP
- 2025至2030中国移动视频监控行业市场占有率及投资前景评估规划报告.docx VIP
- 汽车门锁及空调故障.pptx VIP
- 生态环境数据分级管理指南.pdf VIP
- 八省联考2026届高三年级12月检测训练(T8联考)化学试卷(含答案详解).pdf
- 2022春(六下)顺 - 填空题1.docx VIP
- T∕CACM 1319-2019 慢性阻塞性肺疾病中医诊疗指南.docx VIP
- GZ021 化工生产技术赛项(正式赛卷)仿真操作模块方案及评分6.doc VIP
- 金蝶云星空完整版.pdf VIP
原创力文档


文档评论(0)