b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

什么是面向过程现代的应用程序都运行在一个内存空间里,在32位

电脑杂谈  发布时间:2018-02-13 20:59:33  来源:网络整理

面向过程与面向对象_面向对象_什么是面向过程

现代的应用程序都运行在一个内存空间里,在32位的系统里,这个内存空间拥有4GB的寻址能力。在Linux下默认将高地址的1GB空间分配给内核,低地址的3GB默认是用户空间。在用户空间里,又有不同的区域:

1)栈:栈用于维护函数调用的上下文,离开了栈函数调用就没有办法实现。栈通常在用户空间的最高地址处分配,通常由数兆字节的大小。

2)堆:堆是来容纳应用程序动态分配的内存区域,当程序使用malloc或new分配内存时,得到的内存来自堆里。堆通常存在于栈的下方。堆一般比较大,可以有几十至数百兆字节的容量。

3)可执行文件映像:这里存储着可执行文件在内存里的映像(包括数据段和代码段)。由转载器在装载时将可执行文件的内存读取或映射到这里。

4)保留区:保留区并不是一个单一的内存区域,而是对内存中受到保护而禁止访问的内存区域的总称。

下图是Linux下一个进程典型的内存布局

其中,有个“动态链接库映射区”,这个区域用于映射装载的动态链接库。在Linux下,如果可执行文件依赖其他共享库,那么系统会为它从0x40000000开始的地址分配相应的空间,并将共享库载入到该空间。

1.2.1 什么是栈

栈是写现代操作系统最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函数,没有局部变量。

栈在程序运行中具有举足轻重的地位。最重要的,栈保存了一个函数调用所需要的维护信息,这常常被称为堆栈帧或活动记录。堆栈帧一般包括如下几方面内容:

1)函数的返回地址和参数

2)临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量

3)保存的上下文:包括在函数调用前后需要保存不变的寄存器

在一个函数的活动记录用ebp和esp这两个寄存器划定范围。esp寄存器始终指向栈的顶部,同时也就指向了当前函数的活动记录的顶部。而相对的,ebp寄存器指向了函数活动记录的一个固定位置,ebp寄存器又被称为帧指针。一个很常见的活动记录实例如下:

在参数之后的数据(包括参数)即是当前函数的活动记录,ebp固定在图中所示的位 置,不随这个函数的执行而变化,相反地,esp始终指向栈顶,因此随着函数的执行,esp会不断变化。固定不变的ebp可以用来定位函数活动记录中的各个 数据。在ebp之前首先是这个函数的返回地址,它的地址是ebp-4,再往前是压入栈中的参数,它们的地址分别是ebp-8、ebp-12等。ebp所指 向的数据是调用该函数前ebp的值,这样在函数返回的时候,ebp可以通过读取这个值恢复到调用前的值。一个i386下的函数总是这样调用的:

1)把所有或一部分参数压入栈中,如果有其他参数没有入栈,那么使用某些特定的寄存器传递。

2)把当前指令的下一条指令的地址压入栈中

3)跳转函数体执行

其中第二步和第三步由call指令一起执行。跳转到函数体之后即开始执行函数

4)push ebp; 把ebp压入栈中(称为old ebp)

5)mov ebp,esp; ebp=esp(这时ebp指向栈顶,而此时栈顶就是old ebp)

6)【可选】sub esp,XXX :在栈上分配XXX字节的临时空间

7)【可选】push XXX : 如有必要,保存名XXX的寄存器(可重复多个)

把ebp压入栈中,是为了在函数返回的时候便于恢复以前的ebp值。而之所以可能要保存一些寄存器,在于编译器可能要去某些寄存器在调用前后保存不变,那么函数就可以在调用开始时将这些寄存器的值压入栈中,在结束后再取出。函数返回时:

1)【可选】pop XXX: 如有必要,恢复保存过的寄存器(可重复多个)

2)mov esp,ebp: 恢复esp同时回收局部变量空间


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-76074-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...