程序存储器分段

Posted 98lucifer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序存储器分段相关的知识,希望对你有一定的参考价值。

程序存储器分为:text,data,bss,heap,stack

text:代码段,存储汇编后程序机器语言指令,该段内执行是非线性的。text段禁用写权限。

data:存储程序运行过程中要使用的全局变量,字符串和其他常量。

bss:存储未初始化的内容。

heap:heap段的大小是可变的。heap段中的所有存储单元又配器和回收器算法管理。分配器在堆中预留一部分区域,回收器取消预留的存储器,使该区域可以被下一次预留重新使用。堆从存储器的低地址向高地址增长。

stack(先进后出):stack段的大小是可变的。stack段用作中间结果暂存器来存储断点信息。当一个程序运行时,函数将有它自己的传递变量集,并且函数的代码会在文本段(代码段)的不同存储单元内。函数调用时,程序的运行环境和EIP必须改变,堆栈存储所有被传递的变量,以及函数执行后EIP应该返回的地方。数据被存入堆栈中时成为压栈(Push),数据取出被称为出栈(POP).

 

void test_function(int a,int b,int c,int d)
{
char flag;
char buffer[10];      
}

void main()
{
    test_function(1,2,3,4);
}

这一段代码声明了一个具有4个参数的test函数。

当主函数调用时,值被压入堆栈以创建下述堆栈帧。当调用test_function()时,逆序将函数压入堆栈,函数的参数是1,2,3,4,因而随后的压栈指令压入4,3,2,1.

当汇编call执行执行时,为了将执行环境变成test_function(),返回地址被压入堆栈。这个值是紧跟在当前EIP之后的那一条指令。

紧随返回地址的是帧指针,这个值用来恢复EBP原来的值。然后,把ESP的值复制到EBP中。

技术分享图片

当函数调用时,EIP的值被修改为函数在代码段中的首地址,以执行函数。

函数执行结束时,EIP被设置为返回地址。

技术分享图片

以上是关于程序存储器分段的主要内容,如果未能解决你的问题,请参考以下文章

分段控制的保存和加载状态

如何从我的活动中意图在我的标签栏中分段?

分页存储管理和分段存储管理

分页存储管理和分段存储管理

分页存储管理和分段存储管理

存储器管理 4.9 请求分段存储管理方式