一、栈简介
数据结构中的栈
数据结构中的栈就是在表尾进行插入和删除操作的线性表。可以进行插入(push)和删除(pop)的一端称做为栈顶,栈底是固定不变的一端,空栈是什么数据都没有的栈。栈是一种后进先出的数据结构,先放入的数据最后取出,最后放入栈的数据,最先取出。
数据结构中的栈定义了一些操作。最重要的是PUSH和POP。PUSH操作是在栈顶部压入一个数据,并将栈顶的值加一。POP操作在栈顶部弹出一个数据,栈内删掉一个数据,并将栈顶的值减一。
linux内存布局
Kernel Space:Kernel space 是 Linux 内核的运行空间,User space 是用户程序的运行空间。在设计时考虑到安全因素,内核空间和用户用户是隔离的,即使用户的程序崩溃了,内核也不受影响。
Stack:Linux中的栈与数据结构中的栈类似,是计算机程序中非常重要的理论之一,可以说没有一个程序程序可以离开这种结构栈。用户或者程序都可以把数据压入栈中,不管如何栈始终有一个特性:先入栈的数据最后出栈(First In Last Out, FIFO)。
Heap:堆相对相对与栈来说比较复杂,编程人员在设计时程序可能会申请一段内存,或者删除掉一段已经申请过的内存,而且申请的大小也不确定,可以是从几个字节,也可以是数 GB ,所以堆的管理相对来说比较复杂。
bss段:BSS段通常是一块内存区域用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的。特点是可读写的,程序初始化时会自动清零。
Data段:数据段是一块内存区域它用来存放程序中已初始化的全局变量的。数据段是静态内存分配。
Code段:代码段是一块内存区域来存放程序执行代码的。代码段在程序运行前就已经确定,代码段在内存中是一段只读空间,但有些架构也允许代码段可读写,即允许自修改程序。
操作系统内存组织方式(栈)
计算机使用内存用来装载要将要运行的代码和程序运行时的数据。操作系统在运行中将内存分为两个互不干扰且独立的区域,每个区域内存的组织方式时不同的,这两个独立的区域我们称为栈和堆。栈和堆的设计目标完全不同。在程序调用函数时,程序的参数和局部变量都是从栈中获取。当调用完程序后,会正常返回到上一层,或者抛出异常,为函数参数和局部变量分配的内存空间会自动收回,之后还可被别的程序使用。内存中栈的方法参数和局部变量均有生存期,调用程序时生存期开始,调用程序结束后生存期结束。在C语言中使用malloc关键字创建堆,这是就会在内存中开辟一个堆空间,堆是引用变量,可以在同一个程序不同的位置引用堆内存。使用堆内存要刻意删除,内存中的堆才可以消失。
在mian()函数中,调用了test()函数,这样操作系统就会为程序开辟一个栈。我们来反汇编关键代码,了解操作系统是如何为程序开辟栈的,以及开辟栈的过程。