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



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

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

提前感谢您的回答!

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

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

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

事实是"所有RAM都给了内核">,这样内核就可以管理它。
每当创建进程、加载其代码并请求内存缓冲区时,内核就会使用页表映射将物理内存"分配"给该进程
当进程终止(或其页面被交换出去(时,物理内存将"恢复"回内核。

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

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

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

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

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

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

相关内容

最新更新