内核内存管理详解
1 内核虚拟内存布局
1.1 内核虚拟内存概述
内核如同进程一样,使用虚拟内存,并借助内存管理单元将虚拟内存地址转换为物理页。内核拥有自己的地址空间和相应的虚拟内存布局,其地址空间由地址空间段构成,采用标准的内存架构框架。
大部分内核内存是非分页的,即“固定”的。这是因为内核需要其内存来完成可能影响其他内存相关数据结构的操作系统任务,如果内核在执行内存管理任务(或任何其他影响内存页的任务)时发生页错误,可能会导致死锁。不过,允许内核的一些无死锁部分从可分页内存中分配,主要用于轻量级进程线程栈。
内核内存包含从物理内存(物理内存页)到内核虚拟地址空间的各种映射,内存由一系列分层的内核内存分配器进行分配。两个段驱动程序负责创建和管理大部分内核映射,非分页内核内存使用segkmem内核段驱动程序进行映射,可分页内核内存使用segkp段驱动程序进行映射。在支持大页的平台上,内核的关键和常用部分从大(4MB)页进行映射,以最大化硬件 TLB 的效率。
1.2 内核地址空间
内核虚拟内存布局因平台而异,主要基于平台的 MMU 架构。除sun4u平台外,内核使用进程和内核共享的公共虚拟地址空间的顶部 256MB 或 512MB。与进程地址空间共享内核地址空间分别将可用内核虚拟地址空间限制为 256MB 和 512MB,这在一些较旧的平台上是一个相当大的限制。在sun4u平台上,内核有自己的虚拟地址空间上下文,因此可以大得多。32 位内核的sun4u