第三章 内存管理
3.1 程序的装入和链接
★ 高级语言的源代码转化为进程的3个基本步骤:
编译:由编译程序(compiler)将用户源代码编译成若个目标模块
链接:由链接程序(linker)将目标模块和库函数链接,形成一个完整的装入模块
装入:由装入程序(loader)将装入模块装入内存。
★ 空间分类
名空间:编写程序时,用符号名来访问某一单元。符号名空间
逻辑空间:目标程序中,以0为基址进行编址,符号名用具体的数据代替。
内存空间:物理地址
★ 链接
含义:源程序经过编译后,可得到一组目标模块,再利用链接程序将这组目标模块与所需的库函数链接形成装入模块。
静态链接:在程序运行之前,先将各个目标模块及它们所需的库函数链接成一个完整的装配模块(又称执行模块),以后不再拆开。
装入时动态链接:目标模块在装入内存时,采用边装入边链接的链接方式。
运行时链接:对某些目标模块的链接,是在程序执行中需要该目标模块时,由操作系统去找到该模块并将之装入内存,随后把它链接到调用者模块上。
★ 装入
装入的任务:将可装入模块装入内存;地址重定位:将执行文件中的逻辑地址转化为内存物理地址的过程。
绝对装入方式:
- 在编译时就知道程序将驻留在内存中的具体位置,编译程序产生绝对地址的目标代码
- 装入模块在装入内存时,由于程序中的逻辑地址与实际内存地址完全相同,故不需对
程序和数据的地址进行修改。 - 优点:实现简单、无须进行逻辑地址到物理地址的变换。
- 缺点:程序每次必须装入同一内存区;程序员必须事先了解内存的使用情况,根据内存情况确定程序的逻辑地址;不适于多道程序系统。
可重定位(静态重定位)装入方式:
- 编译时采用相对地址,即编译器假设是装入到从零开始的内存位置。
- 逻辑地址与装入内存后的物理地址无直接关系。
- 必须重定位。静态重定位技术:地址映射在程序装入时进行,以后不再更改程序地址。
- 缺点:程序重定位后就不能移动,因而不能重新分配内存,不利于内存的有效利用;程序在存储空间中只能连续分配,不能分布在内存的不同区域;难于共享。
运行时重定位(动态重定位)装入方式:
- 程序的地址转换不是在装入时进行,而是在程序运行时动态进行。
- 运行时动态装入需要硬件支持,即重定位寄存器,用于保存程序在内存中的起始地址。
- 程序被执行时,通过重定位寄存器内的起始物理地址和指令或数据的逻辑地址计算其物理地址。
- 优点:程序不必连续存放在内存中,可分散存储,可移动;便于共享;有利于