1.1 程序组织
1.1.1 地址空间
- 逻辑地址:程序自身地址空间的地址
- 物理地址:程序实际在内存中的地址
1.1.2 进程的内存空间
- 分为内核空间和用户空间;
- 内核空间在所有进程中都被映射到同一物理地址空间中;
- 另有内存映射段,暂时不表
1.2 程序运行
1.2.1 程序文件的执行
源程序到进程运行的整个过程,主要为编译、链接和装入;
- 编译:编译器,将源程序编译为多个目标模块;
- 链接:链接器,将目标模块与库函数链接成一个装入模块;
- 装入:装入器,将装入模块装入内存以待运行;
1.2.2 链接
1.2.2.1 静态链接
程序运行前,将目标模块链接成完整的装入模块后不再拆开
链接主要做两个工作:
- 相对地址修改
- 变换外部调用符号
1.2.2.2 动态链接
目标模块在装入时才被链接在一起
- 装入时,发现存在发生外部模块调用时才进行链接;
- 此方式,目标模块分散存储,便于修改部分目标模块;
- 便于共享目标模块;
1.2.2.3 运行时动态链接
推迟到运行的时候才进行链接
- 每次运行时,用到的模块都是不同的,
- 故只当发生外部调用时,由OS装入链接之
- 加快了装入链接
1.2.3 装入
1.2.3.1 绝对装入
以程序中实际地址装入内存
- 一般只在单道程序中适用
- 逻辑地址与实际地址相同,不必修改
1.2.3.2 静态重定位装入
装入时,才将逻辑地址转为物理地址
- 装入时一次性完成重定位
- 故不允许装入后移动程序
1.2.3.3 动态重定位装入
执行时,才将逻辑地址转为物理地址
- 适应于程序多次置于内存不同位置,如对换
- 需要重定位寄存器的支持