标签:
进程在运行时的数据结构
a.out及其传说
gcc编译后的程序为什么叫a.out?
原因:linux是在UNIX基础上开发来的,UNIX上最开始可执行程序都是汇编得来(assembleroutput)汇编程序输出。正是这个英文的缩写,所以叫a.out并且沿用至今。
可执行文件的内容
Linux下的可执行文件大体分为5个段,BSS段,文本段,数据段,堆,栈。
使用nm命令可以查看可执行文件的具体段的划分。
3.系统栈和用户栈
Linux中共有四种堆栈(堆栈其实就是指栈)一种是内核栈,一种是位于固定空间的堆栈(0号进程的用户态堆栈),一种是执行系统调用时用来陷入内核的堆栈(内核态堆栈)每个进程都有自己独立的内核态堆栈,最后一种是进程在用户态执行时的用户栈。
大体上我们主要关系两个,内核态栈(系统栈),用户态栈,每一个进程必有这两个栈。
首先,一个进程在执行的时候,有两种情况,一个进程一般以用户态在系统分配给他的地址空间里运行,但是当进程需要执行系统调用(软中断)或硬件中断是,进程上下文切换,进程陷入内核态,此时内核代表进程继续执行,同时用户栈也就转换成系统栈(内核栈)。
转换过程:
首先将用户栈地址保存到内核栈中,然后将CPU堆栈指针寄存器指向内核栈。
设置两个栈的原因:
内核代码和数据对于所有进程是共享的,所以如果只有一个栈就不能做到所有进程共享。共享指的是在需要的时候可以使用。
出于安全考虑,如果只有一个栈,用户就通过可以改变栈上的数据更改内核代码(这是绝对不允许的)
4.栈帧
栈帧:C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。
5.当程序运行时内部数据结构构造
主要看下栈段和堆段:
栈,比较老的一个数据结构。思想就是先进后出。
当程序运行时,系统维护一个指针,通常称为SP,用于提示堆栈当前的顶部位置。
栈有主要有两个用途:
保存自动变量(auto)就是平时声明的变量如(auto)inta;
进行函数调用时,存储与之相关的过程活动记录,被称为一个堆栈结构,另一个名字叫“过程活动记录”。它记载了函数的调用地址,任何不适合装进寄存器的参数等等。
PS:除了递归调用之外,栈并不是必须的,因为在编译时就已经知道了局部变量,参数,返回值等等。
当函数被调用时:
首先C语言有一个自动提供的服务“跟踪调用链”,在这个链中每一个“节点”都是一个过程活动记录。
这个结构体包括:
局部变量
参数
静态连接
指向先前结构体的指针
函数返回值地址
在程序运行时,系统需要维护一个指针fp用于提示活动堆栈结构,它的值是最靠近顶部的过程活动记录。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/zmrlinux/article/details/47052763