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

时间:2018-07-31 18:51:39

标签: memory-management linux-kernel userspace

如果我们有32位CPU,则它可以具有4GB的虚拟地址空间。前3GB(0- 3GB)用于用户空间虚拟地址,其余1GB(3GB-4GB)用于内核虚拟地址。 但是,正如我在许多文章中甚至在LDD书中所读到的那样,据说内核虚拟地址直接与具有固定偏移量的物理内存映射。 即0xc0000001内核虚拟地址已映射到0x1 RAM。实际地址。 而且,为内核映射的物理内存也无法换出。

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

在此先感谢您的回答!

1 个答案:

答案 0 :(得分:0)

  

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

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

  

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

真实的是,“所有RAM都分配给内核” ,以便内核可以对其进行管理。
每当创建一个进程,加载其代码并请求内存缓冲区时,内核就会使用页表映射为该进程“分配”物理内存。
当进程终止(或页面被换出)时,物理内存将“还原”回内核。

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

  

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

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

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

kmalloc()分配(内核)虚拟内存块(将使用物理内存备份)。没有用于分配物理内存块的内核功能。

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

相关问题