的确,答案翻译成加载应该更为合适
前面对地址绑定的介绍只是为了更好的理解本题,要看本题的解析的话直接翻到最后
链接器和加载器:将更抽象的名字与更底层的名字绑定起来,好让程序员使用更抽象的名字编写代码。
总结就是完成地址绑定。
在操作系统出现之前,重定位和库查询都是由链接器实现的,而随着操作系统的出现,可重定位的加载器就从链接器和库中分离出来了。
这是为什么呢?
因为没有操作系统的时候,程序是可以随意支配计算机里面的内存的,正因为它知道所有的内存,所以往往我们的程序都是以固定的内存地址来汇编和链接的。
但是有了操作系统之后,程序就必须和操作系统甚至其他的程序一起共享计算机的内存。这意味着操作系统在程序加载到内存之前是无法确定其运行的确切地址,并将最终的地址绑定从链接时推延到了加载时。
因此,链接器对每一个程序的部分地址进行绑定并分配相对地址,加载器完成最后的重定位步骤并分配实际地址。
不过值得一提的是,由于链接器和加载器相当多的功能重叠,所以他们都能进行重定位。
随着硬件重定位和虚拟内存的出现,每一个程序可以再次拥有整个地址空间,因此连接器和加载器变得不那么复杂了。
硬件重定位:和软件重定位的区别在于,程序可以按照被加载到固定地址的方式来链接。
但是当我们在具有硬件重定位功能的计算机上运行多个程序的时候,会有公共的代码,这就诞生了我们的共享库。
静态共享库:每个库在创建时会被绑定到特定的地址,链接器在链接时将程序中引用的库例程绑定到这些特定的地址。
动态共享库:程序在开始运行之前不会将所用库中的段和符号绑定到确切的地址上。有时这种绑定还会更为延迟。在程序运行过程中也可以加载库进行绑定。Windows最喜欢用的DLL就是动态共享库。
重定位:为程序不同部分分配加载地址,调整程序中的数据和代码以反映所分配地址的过程。
理解了重定位之后,静态重定位和动态重定位就好理解了。
静态重定位:当这个把用户程序加载到内存中的时候,一次性的把所有的逻辑地址转换为物理地址。
动态重定位:程序加载到内存的时候,不改变任何的地址,在程序执行过程当中再进行地址的变换,每执行一条指令就做相应的地址转换工作,程序起始的地址被送入重定位寄存器,CPU在执行的时候把取到的逻辑地址送到MMU(内存管理单元)部件把逻辑地址转换到物理地址。
重定位,通常来说把在装入时对目标程序中指令和数据地址修改的过程称为重定位。
而静态重定位就是,在逻辑地址转换为物理地址的过程中,地址变换是在进程装入时一次完成的,以后不再改变。
优点:是无需增加硬件地址转换机构,便于实现程序的静态连接。在早期计算机系统中大多采用这种方案。
缺点:内存空间不能移动;各个用户进程很难共享内存中同一程序的副本
动态重定位:动态运行的装入程序把转入模块装入内存之后,并不立即把装入模块的逻辑地址进行转换,而是把这
种地址转换推迟到程序执行时才进行,装入内存后的所有地址都仍是逻辑地址。这种方式需要寄存器的支持,其中
放有当前正在执行的程序在内存空间中的起始地址。
优点:内存空间可以移动;各个用户进程可以共享内存中同一程序的副本。
缺点:增加了机器成本,而且实现存储管理的软件算法比较复杂。
转载自https://blog.csdn.net/sunjinbat/article/details/80571241