链接#
将编译后形成的目标模块以及库函数链接在一起形成完整模块。
静态链接:在程序运行前,将目标模块链接。将多个模块链接时,需要解决两个问题
- 修改成统一的相对地址
- 变换外部调用符号,将对应的外部调用符号改编为相对地址
装入时动态链接:装入内存时,边装入边链接,便于修改 / 更新 / 共享
运行时动态链接:可以加快装入过程和程序体积。
装入内存方式
绝对装入:单道程序环境,编译时就已知程序运行时在内存中的地址。产生基于绝对地址的目标代码。绝对装入程序依据程序给出的地址进行定位。
可重定位装入:多道程序环境。多个目标模块起始地址都视为 0,程序中其他地址都是相对地址。装入时修改起始地址(静态重定位)。这种情况下需要一次分配所有内存空间(不考虑虚拟内存)。
动态运行时装入(动态重定位):装入程序把模块装入内存后,不立即把相对地址改为绝对地址。而是把这种地址转换推迟到程序真正要执行时进行。一次装入内存的地址均为相对地址,需要一个重定位寄存器支持。可以让程序内存不连续,可以只装入部分代码,动态申请分配内存。
进程内存映像
程序调入内存之后,内存中的部分,区分为代码段、数据段、堆区、栈区、PCB 等内容