存储器的层次结构
- 从上到下:存储空间越来越大,但是调用的速度越来越慢
- 为什么需要多级存储体系?
这样我们可以实现用最小的成本换最大的资源
程序的装入(地址变换)
- 为什么需要装入程序
因为程序在执行的过程中,只能从实际地址中读取变量的内容,跳转目标指令,但是我们程序在编写的时候,使用的都是相对地址,我们认为地址都是从零开始的,所以需要程序装入来实现从逻辑地址到物理地址的映射
根据装入的时机不同,分为三种装入方式
1、绝对装入
- 在程序编译的时候,直接确定各个指令或者变量的物理地址,再产生汇编语言,生成目标代码
缺点:实现需要知道存储器的内部结构,对开发人员要求很高
应用:单片机
2、可重定位装入方式
- 在程序装入的时候根据转入位置修改程序中访存的地址,再用物理地址替换逻辑地址
缺点:不允许程序运行时候再内存中移动位置
应用:在多道程序环境
3、动态运行时装入方式
- 程序装入的时候不修改存储位置,等待取程序或者实际访问的时候再转换逻辑地址到物理地址,再读写存储器
缺点:复杂度增加
应用:程序可以在内存中移动
程序的链接
- 为什么要链接:多个源程序会产生一组目标代码模快,加上访问到的库文件的模块,一起链接成一个可以执行的程序。但是每个模块的逻辑地址都是从0开始的,链接的时候需要给不同的模板代码重新安排不同的逻辑地址
根据链接的时间不同,分为三种
1、静态链接
- 在程序运行之前,将目标模块和库函数模块一起链接成一格完整的模块
链接时代码修改工作包括:
1、对相对地址进行修改:很多模块相对地址范围发生了变化,相应访存地址也需进行修改。
2、变换外部调用符号:将模块中所用的外部调用符号也都变换为相对地址。
缺点:静态链接简单,但将整个装入模块都装入内存,若其中多数代码并不执行,可能导致内存浪费
2、装入时动态链接
- 在程序装入内存的时候,一边装入一边链接。也即是在装入模块的时候,如果有需要用到一个模块,就开始调用这个模块,进行链接
好处:实现多目标模块的共享,可以将一个目标模块链接到多个应用中
3、运行时动态链接
- 程序装入的时候,只是将最近的模块装入内存,更多的模块,推迟到执行相关函数的时候才将模块载入,进行链接
优点:加快程序的装入、节省了内存,不需要的不用装入内存