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