我正在学习操作系统,有两件事我想了解。
假设地址空间划分为1/3gb(1gb用于内核,3gb用于进程)。
- 如果内核需要使用超过 1gb 会发生什么情况?
- 在启动的时候,如果没有进程,内核是如何映射的?
如果答案详细,但解释得当,以便计算机科学专业一年级学生(我)能够理解,我将不胜感激。谢谢!
我正在学习操作系统,有两件事我想了解。
假设地址空间划分为1/3gb(1gb用于内核,3gb用于进程)。
如果答案详细,但解释得当,以便计算机科学专业一年级学生(我)能够理解,我将不胜感激。谢谢!
内核不需要使用大量内存,但它需要从虚拟地址到物理内存的映射。当处理器启用分页时,访问内存的唯一方法是通过分页机制,即 CPU 指令使用的地址是虚拟地址,而不是物理地址。内核映射是内核能够访问物理内存的任何部分所必需的,例如在将它们映射到进程的地址空间之前访问零页。
Linux 在 20 世纪 90 年代初设计时,目标是在 80386 上运行,该处理器提供 32 位虚拟地址空间。然而,当时典型的 PC 的物理内存不超过 8 兆字节。内核设计为创建 1:1 映射,其中虚拟地址 0xC0000000 指向物理地址 0,虚拟地址 0xC0001000 指向物理地址 0x1000,依此类推,直到物理内存的末尾。内核的代码和数据使用部分地址空间,但大部分内存是可分配给进程的“空闲”页面。
此模型中的进程地址空间被映射到 3 GB 以下的地址空间。多个映射到同一物理内存页的映射可以共存。分配给正在运行的进程的内存页至少有两个映射,即上面描述的“内核视图”和使用 3 GB 以下地址的“进程视图”。
随着 PC 的 RAM 容量不断增加,原本豪华的 1 GB 内核空间变得拥挤不堪,因此引入了各种权宜之计。例如,我们采用了 2 GB + 2 GB 的分割,这样就可以使用 2 GB 的 RAM,但同时将进程地址空间限制为 2 GB。“最终”解决方案当然是转向 64 位处理器,这暂时解决了这个问题。
但事实并非如此。在可以运行 Linux 的机器上,没有这样的静态地址空间划分——恰恰相反,进程和内核使用的虚拟地址空间可以(相对)任意。
请注意,我说的是复数“虚拟地址空间”:不同的进程和内核对物理地址空间都有不同的“看法”,而物理地址空间本身并不是线性的。所以,我不确定这个界限从何而来。
分配超过 1 GB。
在启动时,内核会启用(取决于您使用的 CPU 架构)内存保护,并开始映射自己的内存空间。它会主动随机化该映射 - KASLR。
我不确定你为什么认为 1 GB 有什么特别之处。其实没什么特别的!内核会根据需要映射其内存。
您指的是即将消亡的 32 位 i386 架构的限制吗?在早期版本的 Linux 中,内核地址空间中有一个常量映射
PAGE_OFFSET
(如果我没记错的话,确实是 1 GB?),而用户空间内存空间可能已“映射”到该常量映射之上。因此,无论您从什么材料中学习这一点:都需要更新,并且肯定早于https://en.wikipedia.org/wiki/Kernel_page-table_isolation。