重定位
修改程序中的逻辑地址
可以在编译时或载入时重定位,但
- 编译时重定位不灵活,只能放在内在的固定位置
- 载入时重定位的程序一旦载入内存就不能再移动
由于内存资源有限,很多时候程序载入后还需要换入换出,不能保证程序始终在同一位置。
因此,重定位的最佳时机是运行时,每条指令都要进行地址翻译从逻辑地址算出物理地址。
分段
程序可以由若干部分(段)组成,每个部分有各自的特点和用途。如代码段只读、代码/数据段不会动态增长等
不是将整个程序,而是将各段分别放入内存 是更合理的方式。
定位具体指令或数据时需要通过
<段号,段内偏移>
(如mov [es:bx],ax
),再查询进程段表确定基地址进行重定位。GDT表就是操作系统对应的段表;LDT是每个进程对应的段表