逻辑地址和物理地址有什么区别?

39

我正在阅读《操作系统概念》,现在看到了第八章!然而,我需要一些澄清或确认我的理解是否正确。

逻辑地址:根据书中所述,逻辑地址是由CPU生成的。这到底是什么意思?(在一个执行生成地址系统中..)我猜想,在为程序编译代码时,程序根本不知道代码将被加载到哪个内存位置。编译器只是设置了程序布局和图像应该如何布置的大致草图,但没有为它分配任何真实的地址。当程序被执行时,CPU会取出编译器制作的这个布局图像并分配一些地址(逻辑地址)给从代码生成的那些地址。

物理地址:物理地址直到CPU生成一组逻辑地址(包括基地址和偏移量)后才生成。逻辑地址通过MMU或其他设备,并且沿着某条线路被映射到物理RAM地址。

那么实际差异是什么?我可以看到一个好处。使用逻辑地址使应用程序具有更多自由度。如果物理地址是硬编码的,那么程序的成功将严重依赖于物理计算机机器、可用的RAM地址等。

使用逻辑地址转换为物理地址不是引入了两个步骤,而不是一对一,因此会增加开销吗?

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

看起来将地址保存在RAM中与逻辑内存地址的目的背道而驰。我只能假设我的理解是不正确的。


我建议阅读维基百科关于“页表”或类似主题的文章。 - asveikau
谢谢,页面表项非常有用。 - user427390
10个回答

49

这个答案并不全面,但足以解释清楚虚拟内存系统的基本概念。

在虚拟内存系统中,逻辑地址和物理地址之间存在一定的不一致性。

一个应用程序可以被分配一个虚拟地址空间(例如4G),它可以自由地使用这些地址。从应用程序的角度来看,这是一块连续的好内存。

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

通过这种映射,操作系统和硬件(我将从这里起称之为低层)可以将应用程序页面放置在任何它想放置的地方(无论是在物理内存中还是交换到二级存储器中)。

当应用程序尝试访问逻辑地址50的内存时,低层可以使用翻译表将其转换为物理地址。如果它尝试访问已经被交换到磁盘的逻辑内存,则会引发页错误,并且低层可以将相关数据带回到内存中,放在任何想要的物理地址上。

在物理地址是你所拥有的全部时代,代码必须是可重定位的(或者在加载时进行修正),因为它可以加载到任何地方。有了虚拟内存,该代码(和数据)可以同时存在于十几个不同进程中的逻辑内存位置50——但它的实际物理地址会不同。

它甚至可以被共享,以便一个物理副本同时存在于许多进程的地址空间中。这就是共享代码的关键(这样我们就不需要使用更多的物理内存),以及共享内存使得跨进程通信变得容易。

当然,与纯物理地址环境相比,它的效率要低一些,但CPU制造商试图尽可能地让其效率极高,因为它被广泛使用。优点远大于缺点。


谢谢,这让我恍然大悟。我也认为交换有点过时了。现在还经常使用吗?内存相当便宜。我不知道何时需要在PC上使用交换。笔记本电脑可能会在睡眠/休眠时使用交换。还有其他用途吗? - user427390
3
RAM的价格便宜,但也不是那么便宜,以至于您可以为机器上的100个进程每个提供4G的RAM :-) 还要注意,通常有一个区别,即交换(整个进程被交换出去)和分页(小页面被交换出去)。 后者更有效率。 这也意味着您甚至不需要将不需要的东西加载到物理内存中。 - paxdiablo
1
啊,替换页面更有意义。我想这就是所谓的“分段”,将页面分成不同的段,并仅加载所需的段到RAM中?因此不会使用比实际需要更多的RAM? - user427390
我们能否说地址类型之间的主要区别是“可重定位性”? - user427390
我会说更多的“抽象层次”。逻辑地址在与它们相关联的方面上与物理地址一样不可重定位。你不能使用任意逻辑地址作为你的逻辑地址,尽管你可以使用任意物理地址作为你的逻辑地址。两者之间的映射提供了可重定位性,而不是任何特定层次的属性。这与将文件名映射到逻辑磁盘扇区或将逻辑磁盘扇区映射到(柱面、磁头、扇区)元组没有什么不同。 - paxdiablo
+1 @paxdiablo 很好的答案,即使在阅读 Galvin 的书之后,它也帮助我理解了一些东西。 - Trying

10

逻辑地址是相对于程序的地址。它告诉我们一个特定进程将使用多少内存,但不告诉我们进程的确切位置,这个确切位置将通过使用一些映射生成,并被称为物理地址。


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

在装载时间地址绑定的情况下,为什么逻辑地址和物理地址相同? - Abdelrahman Eid

4

逻辑地址:由CPU生成的地址。当我们把问题交给计算机时,我们的计算机会通过逻辑地址将问题传递给处理器。我们无法看到这个地址被称为逻辑地址。

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


1
逻辑地址是对内存位置的引用,与当前数据分配到内存的情况无关。物理地址或绝对地址则是主存中实际的位置。这一概念出自斯托林斯的第7.2章节。

1

逻辑地址空间与物理地址空间

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

程序生成的所有逻辑地址集合称为逻辑地址空间,而对应于这些逻辑地址的所有物理地址集合称为物理地址空间。现在,虚拟地址到物理地址的运行时映射是由一种硬件设备——内存管理单元完成的。在映射的情况下,基址寄存器称为重定位寄存器。用户进程生成的地址在发送到内存时,重定位寄存器中的值将添加到该地址中。让我们通过以下示例来了解这种情况:如果基址寄存器包含值1000,则用户尝试访问位置0时会动态重新定位到位置1000,访问位置346则映射到位置1346。

用户程序从未看到真正的物理地址空间,它总是处理逻辑地址。由于我们有两种不同类型的地址:逻辑地址范围为(0到最大值),物理地址范围为(R到R+max),其中R是重定位寄存器的值。用户只生成逻辑地址,并认为进程在0到最大值的位置运行。如上文所述,用户程序仅提供逻辑地址,这些逻辑地址必须在使用之前映射到物理地址。

3
你抄袭这篇内容的概率有多大?(参考链接:http://lib.bioinfo.pl/courses/pdf/204) - Andrew Barber
或者其他十几个人们分不清“referred”和“refereed”的网站之一。看来这个特定的答案在剽窃排行榜前100名中 :-) - paxdiablo
我点赞了这个问题,因为它有很好的解释!你提供的链接 @AndrewBarber 不再有效。 - Hashmatullah Noorzai

0
简单来说,逻辑地址被处理器视为一块连续可访问的内存块,但在其下面是不连续的物理内存块。
在其下面,逻辑地址和物理地址之间有很多映射。从虚拟地址到物理地址的运行时映射是由一个叫做内存管理单元(MMU)的硬件设备完成的。

0
据我最好的记忆,物理地址是内存中明确、固定的地址,而逻辑地址由基指针和偏移量组成。
原因就像你基本上所指定的那样。它不仅允许将程序和进程分段为线程和数据,还允许这些程序的动态加载,并允许至少伪并行性,而无需在内存中实际交错指令。

0

我找到了一篇关于操作系统中逻辑地址与物理地址的文章,该文章清楚地解释了这方面的知识。

逻辑地址是在程序运行时由CPU生成的。逻辑地址是虚拟地址,因为它不存在于物理上,因此也被称为虚拟地址。这个地址用作CPU访问物理内存位置的参考。逻辑地址空间这个术语用于表示由程序视角生成的所有逻辑地址集合。硬件设备Memory-Management Unit(MMU)用于将逻辑地址映射到其相应的物理地址。

物理地址标识内存中所需数据的物理位置。用户不直接处理物理地址,但可以通过对应的逻辑地址进行访问。用户程序生成逻辑地址,并认为程序在这个逻辑地址上运行,但程序需要物理内存来执行,因此必须在使用之前将逻辑地址映射到物理地址。物理地址空间这个术语用于表示逻辑地址空间中对应于逻辑地址的所有物理地址。

Logical and Physical Address comparision

来源:www.geeksforgeeks.org


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

Saif,你的回答不完整,提问者问的是逻辑地址和物理地址之间的区别,不仅仅是逻辑地址! - Hashmatullah Noorzai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接