程序执行相关结构

进程在执行时的数据结构

  1. a.out及其传说

gcc编译后的程序为什么叫a.out?

原因:linux是在UNIX基础上开发来的,UNIX上最開始可运行程序都是汇编得来(assembleroutput)汇编程序输出。

正是这个英文的缩写,所以叫a.out而且沿用至今。


  1. 可运行文件的内容

Linux下的可运行文件大体分为5个段,BSS段,文本段。数据段,堆,栈。

使用nm命令能够查看可运行文件的详细段的划分。


3.系统栈和用户栈

Linux中共同拥有四种堆栈(堆栈事实上就是指栈)一种是内核栈,一种是位于固定空间的堆栈(0号进程的用户态堆栈),一种是运行系统调用时用来陷入内核的堆栈(内核态堆栈)每一个进程都有自己独立的内核态堆栈,最后一种是进程在用户态运行时的用户栈。

大体上我们主要关系两个,内核态栈(系统栈),用户态栈。每个进程必有这两个栈。

首先,一个进程在运行的时候,有两种情况,一个进程一般以用户态在系统分配给他的地址空间里运行,可是当进程须要运行系统调用(软中断)或硬件中断是。进程上下文切换,进程陷入内核态,此时内核代表进程继续运行。同一时候用户栈也就转换成系统栈(内核栈)

转换过程:

首先将用户栈地址保存到内核栈中。然后将CPU堆栈指针寄存器指向内核栈。

设置两个栈的原因:

内核代码和数据对于全部进程是共享的,所以假设仅仅有一个栈就不能做到全部进程共享。

共享指的是在须要的时候能够使用。

出于安全考虑,假设仅仅有一个栈,用户就通过能够改变栈上的数据更改内核代码(这是绝对不同意的)


4.栈帧

栈帧:C语言中,每一个栈帧相应着一个未执行完的函数。栈帧中保存了该函数的返回地址和局部变量。


5.当程序执行时内部数据结构构造

主要看下栈段和堆段:

栈,比較老的一个数据结构。思想就是先进后出。

当程序执行时,系统维护一个指针,通常称为SP,用于提示堆栈当前的顶部位置。

栈有主要有两个用途:

  1. 保存自己主动变量(auto)就是平时声明的变量如(autointa;

  2. 进行函数调用时。存储与之相关的过程活动记录,被称为一个堆栈结构,还有一个名字叫“过程活动记录”。

    它记载了函数的调用地址,不论什么不适合装进寄存器的參数等等。


PS:除了递归调用之外,栈并非必须的。由于在编译时就已经知道了局部变量,參数,返回值等等。

当函数被调用时:

首先C语言有一个自己主动提供的服务“跟踪调用链”,在这个链中每个“节点”都是一个过程活动记录。

这个结构体包含:

局部变量

參数

静态连接

指向先前结构体的指针

函数返回值地址






在程序执行时,系统须要维护一个指针fp用于提示活动堆栈结构。它的值是最靠近顶部的过程活动记录。




转载于:https://www.cnblogs.com/ljbguanli/p/7284621.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言程序代码通常具有明确的结构,它直接对应计算机硬件指令。一个典型的汇编语言程序包括以下几个部分: 1. **标签(Labels)**:汇编程序中经常使用标签来标识特定的位置,如函数开始、循环或条件分支的起点。它们提供了一个名称给指令或内存地址,方便程序的阅读和跳转。 2. **指令集(Instructions)**:汇编指令是基本的操作,比如加载数据、存储数据、算术运算、逻辑运算、跳转等。每条指令由操作码(Opcode)和操作数(Operands)组成,操作码指示了执行的操作,而操作数提供了执行操作所需的数据。 3. **数据段(Data Segments)**:这部分存放全局变量、常量、数组等内容,数据以二进制形式存储,通常有固定的偏移地址。 4. **代码段(Code Segments)**:这部分存放程序的执行代码,包括函数的入口点(Entry Point)和出口点(Exit Point),以及调用其他函数的指令。 5. **子程序(Functions)**:为了组织代码并复用,汇编程序员会定义函数,包含一组相关的指令。函数有开始和结束标记,以及可能的参数传递和返回值。 6. **调用约定(Calling Convention)**:确定函数如何在内存中传递参数和返回结果,不同的系统可能有不同的调用约定。 7. **错误处理(Error Handling)**:汇编程序中可能包含异常处理指令或跳转到特定的错误处理区域。 8. **结束标志(End of Program)**:程序的结尾通常有一个终止指令,告诉操作系统执行环境该程序已结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值