linux链接和装入和重定位

pcb中会存储这个进程的基地址和长度。
基址寄存器和限长寄存器,将运行进程的PCB中的基地址和限长存入这两个寄存器,保证不发生越界。

重定位:将各模块逻辑地址转换为物理地址

cpu从内存取值,就需要将外存装入内存,pc指向内存物理地址。
将原来在外存中可装入模块中的偏移地址变成物理地址。
编译完成后,并不分配内存,而只使用偏移地址代表声明的变量,完成符号名到目标模块内偏移地址的转换。如图:
linux链接和装入和重定位_第1张图片

链接:为了不同模块能找到彼此,互相使用代码

链接形成可装入模块。

静态链接:多个模块成为一个连续地址的可装入模块

装入时动态链接:各模块位于不同的内存区域,对编译形成的模块边装入边链接,将互相访问的地址变为绝对地址(各模块装入时确定的基地址+偏移量)。

运行时动态链接:
一个模块需要使用其他模块的代码时才去寻找其基地址,进而求出其物理地址。

装入

绝对装入方式:编译程序产生物理内存的绝对地址的目标代码,适用于单片机,需要熟悉自己的内存。

静态重定位装入方式:代码中的访问其他模块的地址在装入时,替换为其他模块中的物理地址(偏移地址上加上基地址(在装入时确认的))。

缺点:一旦一个模块在内存中发生移动,就需要重新链接。

动态重定位装入:在程序运行时,根据基地址(在程序运行时获得的)和偏移量,动态地计算出代码位置。

态重定位装入和动态重定位装入的主要区别:
确定基地址的时机不同,在静态装入中是在链接阶段就把其他模块的基地址写入代码中了,而动态装入,只有在使用其他模块的代码时候才去寻找其他模块的基地址。

你可能感兴趣的:(Linux,linux)