日期:2014-05-16  浏览次数:20552 次

探索 Linux 内存模型

理解 Linux 使用的内存模型是从更大程度上掌握 Linux 设计和实现的第一步,因此本文将概述 Linux 内存模型和管理。

Linux 使用的是单一整体式结构 (Monolithic),其中定义了一组原语或系统调用以实现操作系统的服务,例如在几个模块中以超级模式运行的进程管理、并发控制和内存管理服务。尽管出于兼容性考虑,Linux 依然将段控制单元模型 (segment control unit model)?保持一种符号表示,但实际上已经很少使用这种模型了。

与内存管理有关的主要问题有:

  • 虚拟内存的管理,这是介于应用程序请求与物理内存之间的一个逻辑层。
  • 物理内存的管理。
  • 内核虚拟内存的管理/内核内存分配器,这是一个用来满足对内存的请求的组件。这种对内存的请求可能来自于内核,也可能来自于用户。
  • 虚拟地址空间的管理。
  • 交换和缓存。

本文探讨了以下问题,可以帮助您从操作系统中内存管理的角度来理解 Linux 的内幕:

  • 段控制单元模型,通常专用于 Linux
  • 分页模型,通常专用于 Linux
  • 物理内存方面的知识

虽然本文并没有详细介绍 Linux 内核管理内存的方法,但是介绍了有关整个内存模型的知识以及系统的寻址方式,这些介绍可为您进一步的学习提供一个框架。本文重点介绍的是 x86 架构,但本文中的知识对于其他硬件实现同样适用。

x86 内存架构

在 x86 架构中,内存被划分成 3 种类型的地址:

  • 逻辑地址 (logical address)?是存储位置的地址,它可能直接对应于一个物理位置,也可能不直接对应于一个物理位置。逻辑地址通常在请求控制器中的信息时使用。
  • 线性地址 (linear address)?(或称为?平面地址空间)是从 0 开始进行寻址的内存。之后的每个字节都可顺序使用下一数字来引用(0、1、2、3 等),直到内存末尾为止。这就是大部分非 Intel CPU 的寻址方式。Intel? 架构使用了分段的地址空间,其中内存被划分成 64KB 的段,有一个段寄存器总是指向当前正在寻址的段的基址。这种架构中的 32 位模式被视为平面地址空间,不过它也使用了段。
  • 物理地址 (physical address)?是使用物理地址总线中的位表示的地址。物理地址可能与逻辑地址不同,内存管理单元可以将逻辑地址转换成物理地址。

CPU 使用两种单元将逻辑地址转换成物理地址。第一种称为分段单元 (segmented unit),另外一种称为分页单元 (paging unit)


图 1. 转换地址空间使用的两种单元
转换地址空间使用的两种单元?

下面让我们来介绍一下段控制单元模型。





回页首


段控制单元模型概述

这种分段模型背后的基本思想是将内存分段管理。从本质上来说,每个段就是自己的地址空间。段由两个元素构成:

  • 基址 (base address)?包含某个物理内存位置的地址
  • 长度值 (length value)?指定该段的长度

分段地址还包括两个组件 ——?段选择器 (segment selector)?和段内偏移量 (offset into the segment)。段选择器指定了要使用的段(即基址和长度值),而段内偏移量组件则指定