一.运行时视图
运行时视图:程序在执行时的主存储器布局。也叫运行时布局。
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)通过寄存器传递(寄存器数量有限)
传参约定,保存约定,寄存器保护约定,线框恢复约定。