【问题标题】:What is the difference between linear ,physical ,logical and virtual memory address?线性,物理,逻辑和虚拟内存地址有什么区别?
【发布时间】:2020-11-09 19:57:21
【问题描述】:

我正在尝试阅读英特尔软件开发人员手册以了解操作系统的工作原理,而这四个寻址术语让我感到困惑。以上是我的理解,如有错误请指正。

线性地址:对于一个孤立的程序来说,一长串从地址 0 开始的内存。该程序的所有段都将从其线性地址寻址。它可能在内存中或磁盘中。

物理地址:出现在 ram 或主存储器引脚中的地址。

逻辑地址:磁盘和内存中交换内存的组合。所有程序的所有线性内存都将保留在逻辑地址空间中。它只能由内核模式使用。从逻辑地址到物理地址的转换由内部硬件完成。

虚拟地址:虚拟地址与线性地址相同。它将仅由操作系统中的用户模式使用。操作系统会从逻辑地址映射虚拟地址。

【问题讨论】:

  • 英特尔手册不会直接讨论交换空间。将进程的虚拟地址空间映射到物理页面或 RAM 或将它们分页到磁盘是操作系统的事情,AFAIK 将物理 RAM + 交换的组合作为单个地址空间讨论并不典型。

标签: assembly x86 operating-system ram memory-address


【解决方案1】:

线性地址空间表示系统上可以形成的所有地址。线性地址空间中任何字节的地址称为线性地址。今天的系统有大约 46 位的内存总线宽度,对应于大约 64 TiB 的线性地址空间。英特尔仅在其平面内存模型中使用该术语。

处理器在其总线上寻址的内存称为物理内存。每个字节都分配有一个唯一的地址,称为物理地址。需要注意的是,除了内存之外,内存映射的 I/O 设备也连接到这条总线上,并且可以被寻址。这个内存区域也不必是连续的,这里的内存控制器将物理地址分配给各个内存条和设备。

分页现在增加了虚拟地址空间:每个程序都分配有自己的线性地址空间。此地址空间中的一些地址是有效的,而另一些则不是。有效地址指的是可能在物理内存中的数据,也指硬盘上的外包数据(交换文件)。翻译由 MMU(内存管理单元)和 TLB(翻译查找缓冲区)或操作系统在硬件中完成。也有可能这些数据根本不存在,只有在访问时才生成,但这在这里太过分了。请注意,这些是虚拟地址

逻辑地址是英特尔在分段内存模型中使用的一个术语:内存被划分为多个段。为了寻址段中的字节,使用逻辑地址。这由一个段选择器和一个偏移量组成。使用段选择器将逻辑地址转换为虚拟地址:选择器包含段的开头及其大小。如果偏移量大于段的大小,则地址无效。将段的开头添加到偏移量会为您提供虚拟地址。这种分段内存模型在 64 位模式下已基本废除。

总结

Logical Addresses -> Virtual Addresses -> Physikal Addresses

虚拟地址和物理地址是线性地址,反之则不然。


参考资料:

【讨论】:

  • 更进一步,解决问题中的一个误解:物理地址直接出现在外部引脚上。 (不仅仅是因为集成 DDR4 内存控制器如何通过将地址作为单独的行/列发送来工作。)正如您所指出的,存在从物理地址空间到 MMIO 和 RAM 的映射。具有双通道内存控制器的系统在物理 RAM 的相邻缓存线(或其他粒度?)的通道之间交替,提高了单个连续流的带宽。
  • 我这里也完全跳过了缓存。
  • 此外,“线性地址”在 x86 术语中具有特定的技术含义,这是 seg:off -> seg_base + offset 的结果。我的理解是,启用分页后,线性地址 = 虚拟地址,then 转换为物理地址是另一个步骤。虚拟地址空间和物理地址空间可以描述为线性(使用该词的常见英语/计算含义)这一事实是另一回事。但我实际上还没有读过英特尔最近对此有什么看法,所以 IDK 如果我发明了这个术语的话。
  • @Peter Cordes:我也使用线性作为分段地址计算的结果。分段到线性和虚拟到物理是两个独立的步骤。
  • @NomanMahdi2424:seg:off(逻辑)到线性发生在 virt->phys 转换之前,因此段基址是虚拟地址。 (请注意,只有 FS 和 GS 可以有非零段基数)。更常见的是,您只需将偏移量(即地址的“正常”部分,如[rdi]视为虚拟地址,因为即使在 32 位模式下,平面内存(段 base= 0) 是标准的。
【解决方案2】:

操作系统不是给每个进程一个虚拟地址空间 4GB 什么的。然后这个地址被编译器翻译成逻辑地址,这是一个独立于任何操作系统实现的 CPU 术语。 所以我认为正确的顺序是:

Virtual -> Logical -> Linear -> Physical

【讨论】:

猜你喜欢
  • 2012-12-30
  • 2012-02-01
  • 2012-11-19
  • 2021-09-11
  • 2019-07-03
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 2014-09-14
相关资源
最近更新 更多