操作系统期末复习 第三讲 简单的程序

一.运行时视图

 运行时视图:程序在执行时的主存储器布局。也叫运行时布局。

1.1代码段(.text)

存放程序的可执行指令,所有的执行都在代码段发生。

1.2数据段(.data)

存放程序的数据,又可以细分为三类。

 只读数据段:存放程序中的含初值常量。这些常量在程序运行途中不得修改。

 读写数据段:存放程序中的含初值常量。这些常量在程序运行时可以更改。

 零初始化数据段(.zidata/.bss-Block Started by Symbol):存放程序中不含初值的(初始化为0的)可修改常量。

1.3堆段和栈段

堆段:存放程序的堆,也即动态分配内存时内存的来源。

 栈段:存放程序的运行栈,以供过程调用时保存和恢复上下文。

 示例程序:

二.程序的装入

2.1代码的搬运

上电状态:与外存不同,内存在刚通电时内容是空的。

至少要将以下可读写属性的段放入内存:

 而只读段需要操作系统从外存读取程序文件的逻辑段,并按照其属性装入内存中。

可执行文件:程序在外存上的储存方式,本质是保存了程序的逻辑布局的描述。

程序的装入:操作系统读取外存上的可执行文件中对程序逻辑布局的描述,在内存中生成程序的物理布局的一个实例。

 可执行文件头:描述程序运行时布局的元数据,一般附加在可执行文件头部。

 代码段:操作系统从可执行文件中读取代码段,并拷贝到内存中的指定地址,操作系统在拷贝完成后设定该段为可读可执行段。

 只读数据段:与代码段类似的拷贝过程。

可读写数据段:操作系统从可执行文件中读取可读写数据段,并拷贝到内存中的指定地址。

 零初始化数据段:操作系统将内存中的指定地址清零。

2.2数据的搬运

堆段:操作系统在内存中的指定地址初始化堆数据结构。

 

 栈段:操作系统通常对该段什么也不做。最后,在将控制权交给程序时,将PC指向.text段,将SP指向.stack段。

PC:Program Counter,是通用寄存器,但是有特殊用途,用来指向当前运行指令的下一条指令。

SP:Stack Pointer,堆栈指针,也是通用寄存器,用于入栈和出栈操作。

三.程序的生成

3.1编程语言与工具链

工具链:编写,链接,调试应用程序往往需要一系列工具的帮助,这一系列工具被称为工具链。

基本的编译工具必须包括编译器,汇编器和链接器,否则无法生成应用程序。若条件允许,好药包含调试器以便增进调试效率。

编译器:将输入的高级语言源程序翻译为汇编语言源程序。*.C/.CPP->*.S/*.ASM(有的可以直接生成*.O/*.OBJ)

汇编器:负责将输入源程序的指令进行组装,生成初步的机器码目标文件。*./ASM->*./OBJ

链接器:负责程序各部分所对应的具体地址,并根据该地址填充所有符号引用、生成最终可执行的二进制文件或供程序员参考的地址映射文件。可执行文件:*.EXE或*.COM 是可直接在操作系统中执行的应用程序,含有完全成熟、可直接执行的机器码。地址映射文件:供程序员参考的一些可选地址映射信息,诸如某段程序或数据最终被链接到哪个地址,等等。

调试器 :系统提供给用户的能监督和控制用户程序的一种工具,可以装入、修改、显示或逐条执行一个程序。

解释器:直接在机器上解释并执行高级语言源程序。也不排斥使用编译器技术,内部先生成机器语言程序再执行。但是,解释器一般不会生成可独立运行的机器语言程序文件。

3.2程序的编译与链接

链接器对目标文件的内容的操作:链接器会先收集全部目标文件的符号,然后给每个符号分配地址。在地址确定后,反过来补全程序中对这些符号地址的引用。包括直接回填法和间接回填法。

直接回填法:链接器生成所有符号的地址后,直接修改.text段中对这些符号的引用,将正确的地址填写到那些引用中去,这样生成的代码就可以访问那些符号了。

直接回填法会修改.text段。

 间接地址法:编译器或汇编器生成目标文件时,在.rwdata段留出一个表格,.text段中的代码对其它符号的引用均通过这个表格进行。

间接地址法不会修改.text段,但会修改.rwdata段。

3.3过程调用与栈框

过程(子程序)结构:程序指针可能在中途反复跳转到同一段过程执行,完毕后返回原处继续执行。比循环结构更强大,因为过程的尾递归可以实现循环,过程还可以嵌套。

简单过程程序:

近过程型:调用者与被调用者处于同一个代码段内。

远过程型:调用者与被调用者处于不同的代码段内。

复杂程序结构:

含参数型:调用者向被调用者传递一个或多个参数。

参数传递有三种方法:

(1)通过全局变量传递(需要在数据段声明)

(2)通过栈传递(记得设置SP和SS)

(3)通过寄存器传递(寄存器数量有限)

返回值型:被调用者向调用者返回一个或多个返回值。

返回值的传递也有三种方法:

(1)通过全局变量传递(需要在数据段声明)

(2)通过栈传递(记得设置SP和SS)

(3)通过寄存器传递(寄存器数量有限)

 

 传参约定,保存约定,寄存器保护约定,线框恢复约定。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值