处理器和虚拟/物理地址

时间:2015-09-29 12:36:40

标签: linux memory memory-management operating-system processor

简而言之,据我了解内存管理,处理器会生成虚拟地址。这些地址使用MMU的每进程地址表转换为相应的物理地址(TLB和页面错误介于两者之间,当需要时)。

我的问题是处理器总是生成虚拟地址吗?在地址空间(用户/内核),处理器模式(用户/内核)和上下文(进程/系统)方面,处理器何时生成物理地址?

5 个答案:

答案 0 :(得分:1)

内存通常对虚拟地址或段没有任何了解,虚拟地址或段是CPU概念,它只是内存,可寻址和可读/可写位的集合。处理器使用物理地址与存储器通信。许多简单的处理器(特别是旧的处理器或特殊的嵌入式用户)没有MMU,虚拟地址或特权模式。那些拥有MMU和虚拟地址的人通常会从禁用的那些开始,或者他们最初使用固定映射,否则如果根本没有映射就没有任何东西可以工作。

因此,物理地址始终在使用,而对于虚拟地址,它取决于CPU和正在使用的软件。

答案 1 :(得分:1)

处理器不知道它是物理地址还是虚拟地址,这是各个MMU进行翻译的工作。

处理器必须将地址放在地址总线上,所以现在路径取决于MMU是启用还是禁用。如果MMU被启用,它将遵循MMU转换的路径,相应的物理地址将被放置在地址总线上,如果MMU被禁用,相应指令生成的相同地址将被放置在地址总线上。

因此,如果MMU被禁用,则程序员有责任所有地址访问都应该是物理地址,否则它将是系统中的异常或中止

答案 2 :(得分:0)

是的,当系统在VM上工作时,指令/程序即使在引导时也只产生VA,尽管页表仍然不存在,但生成的地址与物理地址不同。

但处理器需要物理地址才能访问内存。因此存在从虚拟地址生成物理地址的机制,其被称为通过页表完成的地址转换。是的,无论你在内核模式/用户模式下看到什么,寄存器值都是虚拟地址。但是当处理器实际执行计算时,处理器总是使用物理地址

答案 3 :(得分:0)

  

我的问题是处理器总是生成虚拟地址吗?在地址空间(用户/内核),处理器模式(用户/内核)和上下文(进程/系统)方面,处理器何时生成物理地址?

x86 CPU使用3种不同的“种类”地址运行:

  • physical :用于选择内存中字节的实际地址。用于段基地址,中断描述符表,全局描述符表等。
  • 逻辑:这些是您在禁用分页时大部分时间都使用的地址。它们通过添加相应的段(物理)基地址转换为物理地址。
  • virtual :启用分页时大多数指令使用的地址。它们使用页面目录和表格转换为逻辑地址。

使用哪种地址不依赖于当前权限级别(CPL;“系统模式”,“用户模式”或其间)。它取决于处理器的状态(是否启用分页)和实际指令(例如lidt)。虽然我想可以安全地假设“用户模式”(CPL> 0)中没有物理寻址,因为使用物理地址的指令通常是特权指令。

答案 4 :(得分:0)

通常,CPU只知道“虚拟地址”。即,当你进行任何汇编编程时,任何“加载regs,*(内存ptr)”或类似操作,地址都是虚拟地址。

下图很好地说明了这个概念:

http://slideplayer.com/slide/4394245/(第7页)

enter image description here

来自CPU的任何地址始终是虚拟的。但是如果处理器有一个MMU,那么MMU会在将它们放入内存总线之前拦截地址并将其转换为物理地址(通过Page Table机制)。因此,如果您嗅探内存总线,您将看到物理地址。

参考文献:

https://www.quora.com/What-is-the-return-address-of-kmalloc-Physical-or-Virtual