简而言之,据我了解内存管理,处理器生成虚拟地址。 MMU使用每个进程的地址表将这些地址转换为相应的物理地址(必要时在它们之间具有TLB和页面错误)。

我的问题是处理器是否总是产生虚拟地址? 就地址空间(用户/内核),处理器模式(用户/内核)和上下文(进程/系统)而言,处理器何时始终产生物理地址?

===============>>#1 票数:2

内存通常不了解虚拟地址或段(这是CPU的概念),它只是内存,是可寻址和可读/可写位的集合。 处理器使用物理地址与内存对话。 许多简单的处理器(尤其是较旧的处理器或用于特殊嵌入式用途的处理器)都没有MMU,虚拟地址或特权模式。 那些拥有MMU和虚拟地址的设备通常以禁用它们开始,或者它们首先使用固定映射,因为否则,如果根本没有任何映射,则将无法工作。

因此,物理地址始终处于使用状态,而虚拟地址则取决于所使用的CPU和软件。

===============>>#2 票数:1

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

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

因此,如果禁用了MMU,则由程序员负责,所有地址访问都应为物理地址,否则将是异常或中止系统

===============>>#3 票数:0

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

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

===============>>#4 票数:0

我的问题是处理器是否总是产生虚拟地址? 就地址空间(用户/内核),处理器模式(用户/内核)和上下文(进程/系统)而言,处理器何时始终产生物理地址?

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

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

使用哪种地址并不取决于当前的特权级别(CPL;“系统模式”,“用户模式”或介于两者之间)。 它取决于处理器的状态(是否启用分页)和实际指令(例如, lidt )。 尽管我认为可以安全地假定在“用户模式”下不会进行物理寻址(CPL> 0),因为使用物理地址的指令通常是特权指令。

===============>>#5 票数: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

  ask by Subhajit Kundu translate from so

未解决问题?本站智能推荐:

1回复

32/64位应用程序,操作系统和处理器之间有什么关系?

我已经搜索了这些主题,但是不确定我是否正确理解了它们之间的关系。 我总结了以下几点,请纠正/补充。 32位或64位处理器意味着该处理器可以一次处理32/64位。 使用32位或64位处理器表示基础寄存器,地址总线或数据总线的大小也相同。 为了在32/64位处理器上工作,我们有
2回复

linux中具有相同虚拟和物理地址空间的两个进程(共享大页面)

我知道共享内存的创建(带有普通页面),其中创建的进程的虚拟地址和附加到该进程的虚拟地址是不同的。 但是它们在内部将被映射到相同的物理地址帧。 在我们的项目中,我们分配了巨大的页面(连续和不交换内存),并且我们使用了第三方API(intel DPDK)来创建/附加共享内存(从巨大的页面)。
5回复

虚拟内存确实存在吗? [关闭]

虚拟内存是否确实存在于我们计算机系统中的某个位置(即硬盘上)? 如果不是这样,如果数据不在主内存中,即如何从虚拟内存映射到硬盘中的实际数据,即(发生页面错误)。是否有任何表维护从虚拟内存到硬盘数据的映射。
1回复

虚拟地址到物理地址的转换

我有一个问题,我们如何才能转换虚拟地址并获得该地址到物理内存位置的映射。 我有一个运行在Qemu上的Windows VM,该Windows VM托管在我的Ubuntu Linux系统上。 我想知道我们如何将Windows VM上运行的程序映射到主机/ Linux计算机上的物理内存位置。
3回复

将虚拟地址转换为物理地址

下表页适用于具有16位虚拟和物理地址以及4,096字节页面的系统。 引用页面后,参考位设置为1。 线程会定期将参考位的所有值清零。所有数字均以十进制提供。 我想将以下虚拟地址(十六进制)转换为等效的物理地址。 另外,我想为页表中的相应条目设置参考位。 • 0xE12C
6回复

32对64位......或者,'处理信息'究竟是什么意思

我无法理解32位处理器和64位处理器之间的区别。 我知道32位处理器一次可以访问32位,而64位处理器一次可以访问64位。 但是,一次访问一定数量的位究竟意味着什么呢?
1回复

从逻辑地址转换为物理地址。 逻辑地址为十六进制

如何将十六进制地址转换为物理地址以回答此问题? 我非常困惑,由于语言障碍,我的老师也没有帮助。 假设逻辑地址空间为1KB,页面大小为16个字节。 假定最初在此过程的主存储器中没有页面,并且使用了纯需求页面调度。 当前的空闲框架列表为{2,5,8,1,...} 。 空闲帧列表中的第一
1回复

逻辑地址(虚拟地址空间)而不是物理地址空间的原因

我可以理解分页方案。 对于每一页(逻辑地址+偏移量),页面框架都会被维护。 但是分页需要什么? 可执行程序被加载到RAM存储器中。 为什么需要存储页表(虚拟地址空间)的信息? 为什么没有使用物理地址空间?
5回复

在Linux中是否有用于从虚拟地址确定物理地址的API?

在Linux操作系统中,是否有用于从虚拟地址确定物理地址的API?
1回复

读取物理地址值

玩Meltdown / Spectre。 有这个小程序: pass.c 要从内存中读取物理映射的地址值。 找到了该程序,该程序从用户空间中的虚拟地址获取物理地址: https://github.com/dwks/pagemap 输出: 我的“秘密”