简而言之,据我了解内存管理,处理器会生成虚拟地址。这些地址使用MMU的每进程地址表转换为相应的物理地址(TLB和页面错误介于两者之间,当需要时)。
我的问题是处理器总是生成虚拟地址吗?在地址空间(用户/内核),处理器模式(用户/内核)和上下文(进程/系统)方面,处理器何时生成物理地址?
答案 0 :(得分:1)
内存通常对虚拟地址或段没有任何了解,虚拟地址或段是CPU概念,它只是内存,可寻址和可读/可写位的集合。处理器使用物理地址与存储器通信。许多简单的处理器(特别是旧的处理器或特殊的嵌入式用户)没有MMU,虚拟地址或特权模式。那些拥有MMU和虚拟地址的人通常会从禁用的那些开始,或者他们最初使用固定映射,否则如果根本没有映射就没有任何东西可以工作。
因此,物理地址始终在使用,而对于虚拟地址,它取决于CPU和正在使用的软件。
答案 1 :(得分:1)
处理器不知道它是物理地址还是虚拟地址,这是各个MMU进行翻译的工作。
处理器必须将地址放在地址总线上,所以现在路径取决于MMU是启用还是禁用。如果MMU被启用,它将遵循MMU转换的路径,相应的物理地址将被放置在地址总线上,如果MMU被禁用,相应指令生成的相同地址将被放置在地址总线上。
因此,如果MMU被禁用,则程序员有责任所有地址访问都应该是物理地址,否则它将是系统中的异常或中止
答案 2 :(得分:0)
是的,当系统在VM上工作时,指令/程序即使在引导时也只产生VA,尽管页表仍然不存在,但生成的地址与物理地址不同。
但处理器需要物理地址才能访问内存。因此存在从虚拟地址生成物理地址的机制,其被称为通过页表完成的地址转换。是的,无论你在内核模式/用户模式下看到什么,寄存器值都是虚拟地址。但是当处理器实际执行计算时,处理器总是使用物理地址
答案 3 :(得分:0)
我的问题是处理器总是生成虚拟地址吗?在地址空间(用户/内核),处理器模式(用户/内核)和上下文(进程/系统)方面,处理器何时生成物理地址?
x86 CPU使用3种不同的“种类”地址运行:
使用哪种地址不依赖于当前权限级别(CPL;“系统模式”,“用户模式”或其间)。它取决于处理器的状态(是否启用分页)和实际指令(例如lidt
)。虽然我想可以安全地假设“用户模式”(CPL> 0)中没有物理寻址,因为使用物理地址的指令通常是特权指令。
答案 4 :(得分:0)
通常,CPU只知道“虚拟地址”。即,当你进行任何汇编编程时,任何“加载regs,*(内存ptr)”或类似操作,地址都是虚拟地址。
下图很好地说明了这个概念:
http://slideplayer.com/slide/4394245/(第7页)
来自CPU的任何地址始终是虚拟的。但是如果处理器有一个MMU,那么MMU会在将它们放入内存总线之前拦截地址并将其转换为物理地址(通过Page Table机制)。因此,如果您嗅探内存总线,您将看到物理地址。
参考文献:
https://www.quora.com/What-is-the-return-address-of-kmalloc-Physical-or-Virtual