我曾经听我的操作系统讲师讨论过内核空间中的一种数据结构,称为“内核主页面全局目录”(简称 KMPGD),它用于管理内核页面以及进程的页表。不过我不太明白:
为什么我们需要一个单独的数据结构来管理内核空间页面?
我也尝试在互联网上搜索有关此数据结构的信息,但我没有找到任何讨论它的资源。主要答案是首选基于 x86 和/或 x86_64 架构。
学者喜欢把简单的事情变得令人困惑。所有进程共享相同的内核地址空间。每个进程都有自己的用户地址空间。在任何给定时间,进程的整个可用地址空间是内核地址空间加上进程自己的地址空间。
如何安排完全取决于系统。页表有多种形式。最简单的是线性页表。通过这种方式,您可以拥有一个指向内核页表的系统寄存器(其值永远不会改变)和另一个指向当前进程的用户空间页表的系统寄存器,该页表随着每次上下文切换而变化。
您需要将页表的内核部分与当前进程的部分分开,因为前者是固定的,而后者会随着当前进程的变化而变化。