4.1 存储器的层次结构
最基本的三层结构
现代计算机主流存储器的层次结构
4.2 程序的装入和链接
先导知识
将用户源程序变为可在内存中执行的程序的步骤:
- 编译:由编译程序将用户源代码编译成若干个目标模块
- 链接:由链接程序将编译后形成的一组目标模块,以及它们所需要的库函数链接在一起,形成一个完整的装入模块
- 装入:由装入程序将装入模块装入内存,构造PCB,形成进程(使用物理地址)
- 在多道程序环境下,要使程序运行,必须为之先建立进程。创建进程的第一件事是将程序和数据装入内存。
用户程序的主要处理阶段
- 1、编辑阶段(形成符号空间)
- 2、编译阶段(生成目标代码)
- 3、链接阶段(确定相对地址)
将编译后一组目标模块以及它们所需的库函数装配成一个完整的装入模块。 - 4、装入阶段(可以确定物理地址)
将装入模块放入分到的内存区中。这时需要进行地址重定位。 - 5、运行阶段(可以确定物理地址)
运行可执行的程序file1.exe。
逻辑地址、物理地址和地址映射
- 逻辑地址(相对地址,虚地址):用户程序经过编译链接后形成的以0为基址的地址。
- 不能用逻辑地址在内存中读取信息。
- 物理地址(绝对地址,实地址):内存中存储单元的地址。物理地址可直接寻址。
- 地址映射:将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。
重定位
- 重定位:把程序中的逻辑地址变成内存中的物理地址的过程叫做重定位。
- 静态重定位:在程序执行之前进行,由专门设计的重定位装配程序完成。
- 动态重定位:在程序执行过程中,每次访问内存之前将程序地址变换为内存地址,这种变换是依靠硬件地址变换机构实现的。
4.2.1程序的装入
三种方式:
绝对装入方式(单道)
静态重定位装入方式(不灵活,不支持挂起)
动态重定位装入方式(灵活)
一个无须进行链接的单个目标模块的装入过程。此时目标模块就是装入模块。
1、绝对装入方式
- 在编译时,如果知道程序驻留在内存的什么位置,那么编译程序将产生绝对地址的目标代码。
- 程序中的逻辑地址与实际内存地址完全相同,无需对程序和数据的地址进行变换。
- 优点:装入过程简单。
- 缺点:过于依赖硬件结构,不便多道程序系统。
2、静态重定位装入方式
- 在多道程序环境下,目标模块的起始地址通常从0开始,程序中的其它地址都是相对于起始地址计算的;
- 因此应采用可重定位装入方式,根据内存的实际情况,将装入模块装入到内存的适当位置。
- 在程序执行之前由专门设计的重定位装配程序一次性实现逻辑地址到物理地址的转换.
- 优点:不需硬件支持,可以装入多道程序。
- 缺点:一个程序通常需要占用连续的内存空间; 程序装入内存后不能移动(不支持挂起)。
3、动态重定位装入方式
- 程序装入内存后,并不立即实施地址变换,而是把这种地址转换推迟到程序真正运行时才进行;
- 装入内存后仍是相对地址;
- 应设置一个重定位寄存器。
- 在程序执行过程中,每次访问内存之前将程序地址变换为内存地址,这种变换是依靠硬件地址变换机构实现的
- 优点:
OS可以将一个程序分散存放于不连续的内存空间,可以移动程序。 - 缺点:需要硬件支持,OS实现较复杂。
是虚拟存储的基础。
4.2.2程序的链接
静态链接
- 在程序装入内存之前,将目标模块及所需的库函数链接成一个完整的装配模块,以后不再拆开。
- 静态链接是在生成可执行文件时进行的。
- 事先进行链接,以后不再拆开。
动态链接
装入时动态链接
- 指将用户源程序编译后所得的一组目标模块,在装入内存时,采用边装入边链接的链接方式。
- 优点:
(1) 便于模块的修改和更新;
(2) 便于实现对目标模块的共享。
- 优点:
运行时动态链接
- 指对某些目标模块的链接,是在程序执行中需要该目标模块时,才对它进行链接。
- 优点:
加快装入过程、节省内存空间
- 优点: