【问题标题】:How user virtual address access the physical memory , if all the memory is mapped directly with kernel virtual address如果所有内存都直接映射到内核虚拟地址,用户虚拟地址如何访问物理内存
【发布时间】:2019-01-08 06:03:27
【问题描述】:

如果我们有一个 32 位 CPU,它可以有 4GB 的虚拟地址空间。前 3GB(0-3GB)用于用户空间虚拟地址,其余 1GB(3GB-4GB)用于内核虚拟地址。 但是正如我在很多文章中看到的,甚至在 LDD 书中,都说内核虚拟地址直接映射到具有固定偏移量的物理内存。 即 0xc0000001 内核虚拟地址映射到 0x1 RAM。实际地址。 而且,为内核映射的物理内存不能被换出。

我的问题是,如果所有 RAM 都交给内核,用户空间如何访问物理 RAM。

提前感谢您的回答!

【问题讨论】:

  • "如果所有的 RAM 都给了内核。" - 正如您所说,内核仅使用 1GB 内存。它绝对不是“所有的 RAM”。
  • "所有的 RAM 都交给了内核",以便内核可以管理它。当进程创建、加载其代码并请求内存缓冲区时,内核将使用页表映射为该进程分配物理内存。当进程终止时,物理内存恢复到内核。
  • @Tsyvarev 谢谢。但是在小内存系统中会发生什么?假设我们有 512 MB 的 RAM。在那种情况下,整个 512 MB 内存将映射到内核逻辑地址,对吗?如果该内存是不可交换的,那么用户空间如何使用它?我想我缺少理解一个概念。你能澄清一下吗?
  • @sawdust 感谢您的回答。因此,您的意思是说内核为用户空间进程分配 RAM 内存以运行。这就是内核应该可以访问整个 RAM 内存的原因。因此,假设我们的 RAM 为 1G,系统中只有 1 个用户空间进程正在运行。假设用户空间进程占用了 8KB ( 0 - 0x1FFF ) 的内存,所以只要系统中有这个进程,这个范围的内存将不可用,如果内核进程尝试使用 kmalloc 获取内存,它只能从该地区获取:0x00001FFF - 0x3FFFFFFF)?我的理解正确吗?
  • 我猜你根本无法在 RAM 512M 的 PC 上以“标准”配置运行 Linux 内核。

标签: memory-management linux-kernel userspace


【解决方案1】:

如果所有内存都直接映射到内核虚拟地址,用户虚拟地址如何访问物理内存

这个问题没有意义,因为它的前提不正确。
所有物理内存都没有映射到内核(除非物理 RAM 真的那么小而内核映像那么大)。
内核只映射实际需要保存其代码和数据的物理内存页。
未使用的内存页面进入空闲内存池。

我的问题是,如果所有 RAM 都交给内核,用户空间如何访问物理 RAM。

真正的是“所有的 RAM 都给了内核”,以便内核可以管理它。
每当创建进程、加载其代码并请求内存缓冲区时,内核将使用页表映射“分配”物理内存给该进程。
当进程终止(或其页面被换出)时,物理内存“恢复”回内核。

用户空间应该只知道虚拟内存。它只能访问其虚拟地址空间中已经映射到虚拟内存的物理内存。
从虚拟地址到物理地址的转换以及对 RAM 位置的访问由 CPU 和 MMU 在指令执行期间处理。

假设我们的 RAM 为 1G,系统中只有 1 个用户空间进程正在运行。假设用户空间进程占用了 8KB ( 0 - 0x1FFF ) 的内存,所以只要系统中有这个进程,这个范围的内存将不可用,如果内核进程尝试使用 kmalloc 获取内存,它只能从该地区获取:0x00001FFF - 0x3FFFFFFF)?我的理解正确吗?

不,你的理解不正确。
内存以页为单位分配,不保证连续的虚拟页映射到连续的物理页。
因此,您不能假设将为用户进程映射哪些物理内存页面

虚拟到物理内存的映射也不是永久的。
虚拟内存页面的内容可以在不使用时换出,然后该物理内存可以被另一个进程或内核使用。
该进程不拥有任何物理内存,并且仅因为它已(临时)映射到该进程的虚拟页面而使用物理内存页面。

kmalloc() 分配一块(内核)虚拟内存(将用物理内存备份)。没有用于分配物理内存块的内核函数。

注意,只有虚拟地址空间分为用户空间和内核空间。物理内存没有这样的划分。

【讨论】:

  • 感谢您的解释。还有一个小问题。这句话是否属实:“为内核保留的虚拟地址空间(即 1g/3g 拆分中的 1gb)不可交换”。这意味着如果我们从内核空间访问一个有效的内核虚拟/逻辑地址,我们将永远不会出现页面错误。
  • 这措辞很尴尬。见Do kernel pages get swapped out?
猜你喜欢
  • 2015-05-24
  • 1970-01-01
  • 2018-10-09
  • 2018-07-09
  • 2014-09-06
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多