没有合适的资源?快使用搜索试试~ 我知道了~
堆栈是一种先进后出的数据结构,是计算机中最常用的一种数据结构,堆栈可以用数组 实现,也可以用链表实现。其中,堆(heap)中存放的是用malloc 分配地址的动态变量或 c++中的对象等数据;栈(stack )又称称为堆栈(习惯上的叫法),存放的是局部变量
资源推荐
资源详情
资源评论




























linux 内核探析
第 1 页 共 10 页
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lunix 函数堆栈操作过程
powered by hong sheng , jiangsu university ,zhenjiang
Wed Nov 20 , 2013
1.理论分析
堆栈是一种先进后出的数据结构,是计算机中最常用的一种数据结构,堆栈可以用数组
实现,也可以用链表实现。其中,堆(heap)中存放的是用 malloc 分配地址的动态变量或
c++中的对象等数据;栈(stack )又称称为堆栈(习惯上的叫法),存放的是局部变量。在讲解
Lunix 函数堆栈操作之前,我们先了解一些与堆栈操作有关的寄存器概念:
esp: (extend stack pointer)堆栈指针,32bit 长度,形像地称为栈顶指针。用来存放当前线程的栈顶地
址。它总是指向栈的顶部。
ebp:(extend base pointer)基址指针,也被称作为框架指针(frame pointer)。用来存放当前线程的栈
底地址。
eip:(extend instructure pointer)指令指针。存放下一个 cpu 指令在代码段(code segment)中的地址。
在了解有关寄存器的概念之后,下面描述针对运行在 Intel x86 系列芯片上 Linux 的 gcc
编译器的堆操作。
图 1 是一个典型的栈帧,图中,栈顶在上,地址空间往下增长。
下面是 main 调用 int foo(int arg1, int arg2, int arg3)函数时的栈的内容:

linux 内核探析
第 2 页 共 10 页
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int foo(int arg1, int arg2, int arg3)
{
int localvariable1;
int localvariable2;
}
int main()
{
……..
int foo(int arg1, int arg2, int arg3);
……..
return 0;
}
并且,foo 有两个局部的 int 变量(4 个字节)。在这个简化的场景中,main 调用 foo。这里,
main 是调用函数(calling function),foo 是被调用函数(called function)。esp 被 foo 使用来
指示栈顶。ebp 相当于一个“基准指针”。从 main 传递到 foo 的参数以及 foo 本身的局部变量
都可以通过这个基准指针为参考,加上偏移量找到。由于被调用者允许使用 EAX,ECX 和
EDX 寄存器,所以如果调用者希望保存这些寄存器的值,就必须在调用子函数之前显式地
把他们保存在栈中。另外,foo 参数的进栈顺序与申明顺序相反。
(1)函数调用前调用者的动作
在我们的例子中,调用者是 main,它准备调用函数 foo。在函数调用前,main 正在用
ESP 和 EBP 寄存器指示它自己的栈帧。
首先,main 把 EAX,ECX 和 EDX 压栈。这是一个可选的步骤,只在这三个寄存器内容需
要保留的时候执行此步骤。
接着,main 把传递给 foo 的参数一一进栈,最后的参数最先进栈。例如,我们的函数调用
是:
a = foo(12, 15, 18);
最后,main 用 call 指令调用子函数:
call foo
当执行 call 指令的时候,EIP 指令指针寄存器的内容(返回地址)被压入(push)栈中。
因为 EIP 寄存器是指向代码段中的下一条指令,所以当调用返回时,弹出(pop)压入点的
数据,重新赋给 eip,就可以继续执行代码段后的其他内容了。以上压入返回地址和弹出返
回地址分别由 call 和 ret 指令自动完成。在 call 指令执行完之后,下一个执行周期将从名为
foo 的标记处开始。图 2 展示了 call 指令完成后栈的内容。
剩余9页未读,继续阅读
资源评论


nowlaternever
- 粉丝: 0
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 企业网络系统建设的意义.doc
- 智能制造背景下物联网专业教学模式的探索.docx
- 监理规划范本vb.doc
- 信息化系统-安全运维服务专业技术方案专业技术方案(标书).docx
- 幼师计算机任务驱动式教学中的任务设计分析.docx
- C++设计方案程序考试管理系统.doc
- 软件产品的渠道运营方案.docx
- 构建互联网+小学数学微课课堂研究.docx
- 做中学理论在计算机教学中的应用.docx
- 神经网络与深度学习课程设计(Neural-NetworksAndDeep-Learning新闻文本分类)
- (源码)基于Next.js框架的Fiama Comunity页面模仿.zip
- 大型工程建设项目管理方法的研究与实践.docx
- 农村地区互联网金融发展现状分析.docx
- 如何在windowsXP操作系统上安装iis怎么样建立网站.doc
- 八上信息技术Flash教案.doc
- 电力通信或成5G网络切片技术商业化突破.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
