关于内存管理:逻辑地址和物理地址之间的区别?

Difference between logical addresses, and physical addresses?

我正在阅读《操作系统概念》,而我正在第8章!但是,我可以澄清一下,也可以保证我的理解是正确的。

逻辑地址:根据该书,逻辑地址由CPU生成。这到底是什么意思? (在执行生成的地址系统中。)我假设为程序编译代码时,程序不知道代码将在内存中的加载位置。编译器所做的全部工作是建立程序布局的一般草图以及如何布局图像,但不为其分配任何实际地址。执行程序时,CPU会获取编译器生成的布局图像,并将一些地址(逻辑地址)分发给从代码生成的地址。

物理地址:直到CPU生成一组逻辑地址(由基地址和偏移量组成)后,才会生成物理地址。逻辑地址通过MMU或其他设备,并且沿该行的某个位置将逻辑地址映射到物理RAM地址。

那么实际的区别是什么?我看到一个好处。使用逻辑地址为应用程序提供了更大的自由度。如果物理地址是硬编码的,那么程序的成功将在很大程度上取决于物理计算机,可用的RAM地址等。

逻辑地址转换为物理地址的使用不是强制执行两个步骤,而不是一对一地执行,因此开销更大吗?

逻辑地址在生成之后将驻留在哪里?它们可能在CPU为进程提供服务时存在于CPU的寄存器中,但是在此之前和之后,它们又去哪里了?我了解这取决于实现。我认为它们可能存储在某些特殊的寄存器空间或CPU上的缓冲区中,例如TLB,对吗?如果不存在,那么该表可能存在于实际的RAM本身中,并且CPU仅在RAM中保留指向该表基地址的指针/地址,对吗?

似乎将地址保存在RAM中与逻辑存储器地址的目的相反。我只能假设我的理解是不正确的。


这个答案绝不是详尽无遗的,但它可能足以解释问题。

在虚拟内存系统中,逻辑地址和物理地址之间存在断开连接。

可以为应用程序提供4G的虚拟地址空间。这是它的可用内存,可以根据需要免费使用。从应用程序的角度来看,这是一个很好的连续内存块。

但是,它不是唯一运行的应用程序,操作系统必须在它们之间进行中介。在这个很好的连续模型下,有很多映射正在将逻辑地址转换为物理地址。

通过这种映射,操作系统和硬件(我将从这里开始将其称为较低层)可以自由地将应用程序页面放置在所需的任何位置(在物理内存中或换出到辅助存储中)。

当应用程序尝试访问逻辑地址50处的内存时,较低级别的用户可以使用转换表将其转换为物理地址。而且,如果它尝试访问已换出到磁盘的逻辑内存,则会引发页面错误,并且较低的级别可以将相关数据以所需的任何物理地址带回到内存中。

在过去只有物理地址的糟糕年代,代码必须可重定位(或在加载时固定),因为它可以在任何地方加载。使用虚拟内存,该代码(和数据)可以同时在多个不同进程中的逻辑内存位置50中-但是它的实际物理地址会有所不同。

甚至可以共享它,以便在多个进程的地址空间中一次存在一个物理副本。这是共享代码(因此我们使用的物理内存不超过需要的数量)和共享内存的关键,以允许轻松的进程间通信。

当然,它的效率不如纯物理地址环境低,但是CPU制造商试图使它效率尽可能高,因为它已被大量使用。优点远大于缺点。


逻辑地址是相对于程序的地址。它告诉一个特定进程将占用多少内存,而不告诉该进程的确切位置是什么,以及我们将通过使用某些映射生成的确切位置,称为物理地址。


  • 由CPU生成的地址通常称为逻辑地址。程序生成的所有逻辑地址的集合称为逻辑地址空间。而由存储单元看到的地址,即加载到存储器的存储地址寄存器中的地址,通常称为物理地址。对应于逻辑地址的所有物理地址的集合称为物理地址空间。
  • 编译时和加载时地址绑定方法生成相同的逻辑和物理地址。但是,在执行时地址绑定方案中,逻辑和物理地址空间不同。
  • 用户程序永远看不到物理地址。该程序创建一个指向逻辑地址的指针,例如346,将其存储在内存中,对其进行操作,然后将其与其他逻辑地址进行比较-全部为数字346。
    仅当逻辑地址用作存储器地址时,它才相对于基址/重定位寄存器进行重定位。称为内存管理单元(MMU)的内存映射硬件设备将逻辑地址转换为物理地址。
  • 逻辑地址范围为0到最大。生成逻辑地址的用户程序认为该进程在0到最大位置上运行。
    在使用逻辑地址之前,必须先将其映射到物理地址。对于基址/重定位寄存器值R,物理地址的范围从(R + 0)到(R + max)。
  • 例:
    enter image description here
    使用内存管理单元(MMU)和重定位/基址寄存器从逻辑地址映射到物理地址
    重定位/基址寄存器中的值在发送到内存时,将其添加到用户进程生成的每个逻辑地址中,以生成相应的物理地址。
    在上图中,基本/重定位值为14000,然后用户尝试访问位置346的尝试映射到14346。

  • 逻辑地址:-CPU生成的逻辑地址。当我们将问题交给计算机时,我们的计算机通过逻辑地址将问题传递给处理器,我们没有看到这个地址称为逻辑地址。

    物理地址:-当处理器创建过程并解决问题时,我们通过称为物理地址的地址将数据存储在辅助存储器中


    逻辑地址是对内存位置的引用,与当前数据到内存的分配无关。
    物理地址或绝对地址是主内存中的实际位置。

    在《失速》的第7.2章中。


    逻辑与物理地址空间

    CPU生成的地址通常称为"逻辑地址",而内存单元看到的地址,即加载到内存的内存地址寄存器中的一个地址,通常称为"物理地址"。编译时和加载时地址绑定生成相同的逻辑和物理地址。但是,执行时间地址绑定方案导致不同的逻辑和物理地址。

    程序生成的所有逻辑地址的集合称为逻辑地址空间,而与这些逻辑地址相对应的所有物理地址的集合为"物理地址空间"。现在,从虚拟地址到物理地址的运行时映射由硬件设备称为内存管理单元。在映射基址寄存器的情况下称为重定位寄存器。重定位寄存器中的值被添加到用户进程发送到内存时生成的地址中,让我们理解这种情况借助于示例:如果基址寄存器包含值1000,那么用户对地址0的寻址尝试将动态地重定位到位置1000,对位置346的访问将映射到位置1346。

    用户程序永远看不到实际的物理地址空间,它始终处理逻辑地址。由于我们有两种不同类型的地址,逻辑地址在(0到最大)范围内,而物理地址在(R到R + max)范围内其中R是重定位寄存器的值。用户仅生成逻辑地址,并认为该进程在0到max的位置运行。从以上文本可以明显看出,用户程序仅提供逻辑地址,因此必须映射这些逻辑地址到实际地址后再使用。


    我在操作系统中找到了有关逻辑地址与物理地址的文章,其中对此做了清楚的解释。

    逻辑地址是由CPU在程序运行时生成的。逻辑地址是虚拟地址,因为它实际上并不存在,因此也称为虚拟地址。该地址用作CPU访问物理内存位置的参考。术语"逻辑地址空间"用于表示由程序透视图生成的所有逻辑地址。
    称为内存管理单元的硬件设备用于将逻辑地址映射到其相应的物理地址。

    物理地址标识所需数据在内存中的物理位置。用户从不直接处理物理地址,而是可以通过其相应的逻辑地址进行访问。用户程序生成逻辑地址,并认为该程序正在该逻辑地址中运行,但是该程序需要物理内存才能执行,因此,在使用逻辑地址之前,必须将其映射到物理地址bu MMU。术语"物理地址空间"用于与逻辑地址空间中的逻辑地址相对应的所有物理地址。

    Logical and Physical Address comparision

    资料来源:www.geeksforgeeks.org


    尽我所能,物理地址是显式的,是在内存的石头地址中设置的,而逻辑地址则由基址指针和偏移量组成。

    原因是您已基本指定。它不仅允许将程序和进程分割为线程和数据,而且还允许动态加载此类程序,并至少允许伪并行,而无需在内存中进行任何实际的指令交织。


    从执行的应用程序的角度来看,逻辑地址是项(内存单元,存储元素,网络主机)似乎驻留的地址。