操作系统——第三章 内存管理

(.exe)

exe load 到内存里 转换为物理地址

=

静态链接(就是静态的库) 比如printf

(exe位于外存上)

 

动态链接

(在装入时动态链接 注意区别右边图不是exe 而是内存)

(dll

总结:

程序在系统中运行,必须经过以下几个步骤。 
(1)编译,由编译程序对用户源程序进行编译,形成若干个目标模块。 
(2)连接,由链接程序将编译后形成的一组目标模块以及他们所需要的库函数链接在一起,形成一个完整的装入模块。 
(3)装入,由装入程序(Loader)将装入模块装入内存。

程序的装入和连接

程序的装入

  1. 绝对装入方式

适用单道程序,因为可预测程序将驻留在内存什么位置。用户将程序编译后,将产生绝对地址(物理地址)的目标代码。

  • 可重定位装入方式

    适用于多道程序环境,编译程序不可能预知编译后的目标模块放在内存中何处。因此应采用可重定位装入方式,它可以根据内存的具体情况将装入模块装入到内存的适当位置。 
    可重定位装入程序将装入模块装入内存后,会使装入模块中的所有逻辑地址与实际装入内存的物理地址不同。又因为地址变化通常是在进程装入时一次完成的,后不变化,故称静态重定位。

  • 动态运行时的装入方式 

    动态运行时装入程序把装入模块装入内存后,并不立即把装入模块中的逻辑地址转换为物理地址,而是把这种地址转换推迟到程序真正要执行时才进行。为使地址转行不影响指令的执行速度,这种方式需要重定位寄存器的支持。

程序的链接

  1. 静态链接方式

程序运行前,将各目标模块及他们所需的库函数链接成一个完整的装配模块。以后不再拆开。我们把这种方式称为静态链接方式。 
eg:目标模块A,B,C,长度分别为L,M,N。 
(1)对相对地址进行修改。由编译程序产生的所以目标模块中,都是用的时相对地址,其起始地址都为0,每个模块中的地址都是相对于起始地址计算的。链接成装入模块后,原模块B和C在装入模块的起始地址不再是0。 
(2)变换外部调用符号,将每个模块中所用的外部调用符号也变为相对地址。

    • 装入时动态链接

      将用户源程序编译后得到的一组目标模块,在装入内存时,采用边装入边链接的方式。即在装入目标模块的时候,若发生了一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并装入内存。 
      (1)便于修改和更新。对于静态链接装配到一起的装入模块,如果要修改或更新其中的某个模块必须重新打开装入模块。若采用动态链接方式,由于各目标模块时分开存放的,所以要修改各目标模块相对容易。 
      (2)便于实现对目标模块的共享。在采用静态链接的方式时,每个应用模块都必须含有其目标模块的拷贝,无法实现对目标模块的共享。但采用装入时动态链接的方式时,OS很容易将一个目标模块链接到几个应用模块上,实现多个应用程序对该模块的共享。

    • 运行时动态链接 

      将某些模块的链接推迟到程序执行时才进行。即在执行中,发现一个被调用模块尚未装入内存时,OS去找到该模块,并将之装入内存,将其链接到调用者模块上,凡在执行过程中未被调用的目标模块,都不会被调入内存和被链接到装入模块上。

 

 

 

 

 

 

 

 

 

 

 

页式存储:…动态存储…

段式存储:把程序分段存储…

段页式存储: 段加页的存储….

 

虚拟存储器:

原文地址:https://www.cnblogs.com/eret9616/p/9455122.html