【发布时间】: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