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

Memory management 如果所有内存都直接映射到内核虚拟地址,那么用户虚拟地址如何访问物理内存,memory-management,linux-kernel,userspace,Memory Management,Linux Kernel,Userspace,如果我们有32位CPU,它可以有4GB的虚拟地址空间。第一个3GB 0-3GB用于用户空间虚拟地址,其余1GB 3GB-4GB用于内核虚拟地址。 但正如我在许多文章中读到的,甚至在LDD书籍中,都说内核虚拟地址直接映射到具有固定偏移量的物理内存。 i、 e.0xc0000001内核虚拟地址映射到0x1 RAM。物理地址。 而且,映射到内核的物理内存也不能交换出去 我的问题是,如果所有RAM都给内核,那么用户空间如何访问物理RAM 提前感谢您的回答 如果所有内存都直接映射到内核虚拟地址,那么用户虚

如果我们有32位CPU,它可以有4GB的虚拟地址空间。第一个3GB 0-3GB用于用户空间虚拟地址,其余1GB 3GB-4GB用于内核虚拟地址。 但正如我在许多文章中读到的,甚至在LDD书籍中,都说内核虚拟地址直接映射到具有固定偏移量的物理内存。 i、 e.0xc0000001内核虚拟地址映射到0x1 RAM。物理地址。 而且,映射到内核的物理内存也不能交换出去


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

提前感谢您的回答

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

这个问题毫无意义,因为它的前提是不正确的。 除非物理RAM真的那么小,内核映像那么大,否则所有物理内存都不会映射到内核。 内核只映射实际需要用来保存代码和数据的物理内存页。 未使用的内存页进入可用内存池


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

真正的情况是,所有RAM都分配给内核,以便内核能够管理它。 每当创建一个进程、加载其代码并请求内存缓冲区时,内核都会使用页表映射为该进程分配物理内存。 当进程终止或其页面被换出时,物理内存将恢复到内核

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

假设我们的RAM是1G,系统中只运行了一个用户空间进程。假设用户空间进程占用了8KB 0-0x1FFF的内存,那么只要进程在系统中,这个内存范围就不可用,如果内核进程试图使用kmalloc获取内存,它只能从以下区域获取:0x00001FFF-0x3FFFFFFF?我的理解正确吗

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

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

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


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

如果所有的RAM都给了内核。-正如您所说,内核只使用1GB内存。它肯定不是所有的RAM。所有的RAM都给了内核,以便内核能够管理它。当创建进程、加载其代码并请求内存缓冲区时,内核将使用页表映射为该进程分配物理内存。当进程终止时,物理内存将恢复到内核。@Tsyvarev谢谢。但是在小型内存系统中会发生什么呢?假设我们有512MB的RAM。在这种情况下,整个512MB内存将映射到内核逻辑地址,对吗?如果内存是不可交换的,那么用户空间如何使用它呢?我想我没有理解一个概念。你能澄清一下吗?@sawdust谢谢你的回答。所以,您的意思是说内核为用户空间进程分配RAM内存来运行。这就是为什么内核应该可以访问整个RAM内存。假设我们的RAM是1G,系统中只运行了一个用户空间进程。假设用户空间进程占用了8KB 0-0x1FFF的内存,那么只要进程在系统中,这个内存范围就不可用,如果内核进程试图使用kmalloc获取内存,它只能从以下区域获取:0x00001FFF-0x3FFFFFFF?我的理解正确吗?我想你根本无法在带有RAM 512M的PC上以标准配置运行Linux内核。谢谢你的解释。还有一个小问题。这句话是真的吗:为内核保留的虚拟地址空间,即1g/3g拆分中的1gb
不可交换。这意味着,如果我们从内核空间访问一个有效的内核虚拟/逻辑地址,就永远不会出现页面错误。看见