2.2 内存管理
2.1节介绍了与内存取证有关的硬件构成,本节讲述访问内存在逻辑上是如何进行和实现的。
内存管理的主要任务是管理内存资源,为多道程序运行提供有力的支撑,便于用户使用内存资源,提高内存空间的利用率。内存管理的主要功能如下。
(1)内存分配。内存管理根据用户程序的需要分配给它内存资源,这是多道程序能并发执行的首要条件。
(2)内存共享。内存管理能让内存(本书中有时用内存,有时用主存,没有区别)中的多个用户程序实现存储资源的共享,以提高存储器的利用率。
(3)地址转换与内存保护。内存管理负责把用户的逻辑地址转换成物理地址,同时要保证各个用户程序相互隔离起来互不干扰,更不允许用户程序访问操作系统的程序和数据,从而保护系统和用户程序存放在内存中的信息不被破坏。
(4)内存扩充。由于受到处理器寻址能力的限制,一台计算机的物理内存容量总是有限的,难以满足用户大型程序的需求,而外存储器容量大且价格便宜。内存管理还应该能从逻辑上扩充内存储器,把内存和外存混合起来使用,为用户提供一个比内存实际容量大得多的逻辑编程空间,方便用户的编程和使用。
2.2.1 Intel64和IA-32内存管理概述
本书基于英特尔32 bit(IA-32)和64 bit(Intel 64)架构的处理器介绍与内存取证和分析相关的概念和功能,具体技术细节可参考英特尔的技术手册[4]。
Intel即英特尔64 bit体系架构。IA-32为Intel Architecture 32 bit的简称,即英特尔32 bit体系架构。本书不明显标出的情况下,一般指的是IA-32处理架构。IA-32处理架构在英特尔公司1985年推出的80386微处理器中首先采用,具有32 bit内存地址和32 bit数据操作数的处理器体系结构。通常,运行在IA-32架构上的程序允许拥有232 bit,即4 GB大小的物理和虚拟地址空间。后面还会看到,通过物理地址扩展(Physical Address Extension)功能,允许进程访问最多64 GB的虚拟地址空间。IA-32提供实模式(实地址)和保护模式(虚地址)两种工作模式。保护模式是CPU的主要工作模式,支持虚拟内存、分页、权限、分段等功能。本书讨论的内容都是基于CPU保护模式下的。
IA-32架构下处理器的内存管理功能分为两部分:分段(Segmentation)和分页(Paging),如图2-2所示。
图2-2 分段和分页
2.2.2 分段
分段提供了一种隔离机制,将不同代码、数据和栈模块隔离开来,使运行在同一处理器上的多个程序(或者任务)互不干扰。
段指一块供程序存放代码或数据的长度不定的内存。分段是把多个内存段相互隔离的方法,使多个程序可以互相隔离地运行而不会相互干扰。分段地址是一个16 bit段描述符和一个32 bit偏移地址的组合。段描述符包含了段的基址(起始地址)、大小等信息,基址与偏移地址相加就得到了线性地址。段描述符存在两种类型的表中:全局描述符表(GDT,Global Descriptor Table)和局部描述符表(LDT,Local Descriptor Table)。每个处理器内核使用两个特殊的存储器保存指向这两个表的指针,如图2-2所示。
英特尔处理器架构下,分段是强制执行的,这是为了与以前的老系统兼容。
2.2.3 分页
分页机制为请求分页(Demand Paging)、虚拟内存系统提供支持,当程序执行环境的部分需要时,将其映射到物理内存。分页也可以用来隔离多个任务空间。
英特尔处理器的架构采用分页式存储管理,把一个作业存放到若干不相邻接的分区中,这样既可免去移动信息的工作,又可充分利用主存空间,尽量减少主存内的碎片。其把物理地址分成大小相等的许多区,每个区称为页框(Page Frame)。同样,把进程的逻辑地址空间也分成大小相等的区,大小与页框的大小相等,每个区称为一个页(Page)。页表记录了每一个页面在物理内存中的地址。操作系统动态地完成虚拟地址到物理地址的变换。这样就允许操作系统将任意大小的程序加载到任何可用的页框中,仅有当前使用的页被装入内存,不用的页保留在磁盘上直到它们被调用为止。这样就允许许多大的程序在相对较小的内存系统中运行。
用分页式存储管理时,程序使用的地址空间仍然是连续的。所以,用户在编制程序时只需使用顺序的地址,而不必考虑如何分页。由地址转换机制和操作系统管理的需要决定页面的大小。用户进程在主存空间中的每个页框内的地址是连续的,但页框和页框之间的地址可以不连续,如图2-2所示。
当CPU中的寄存器CR0的分页标志位为0时(CR0.PG=0),不使用分页机制,处理器将线性地址直接视为物理地址。
当CPU中的寄存器CR0的分页标志位为1(CR0.PG=1),并且处于保护模式时(CR0.PE=1),处理器使用分页模式。根据寄存器CR4的标志位CR4.PAE和IA32_EFER寄存器的标志位IA32_EFER的值,决定采用何种分页模式。
目前,Intel处理器的分页模式有3种:32 bit分页模式(32-bit Paging)、PAE分页(PAE Paging)和四级分页(4-Level Paging,曾用术语IA-32e分页)。
2.2.4 地址空间
CPU在运算和存取数据时需要知道数据存放的位置,一般使用“地址”这个术语表述用于内存中的存取基本单位,每个地址被赋予了唯一的序号,也叫作内存地址,通常以十六进制的数字表示。内存中一般以字节为单位存储信息,一个字节为8 bit二进制数。
地址空间(Address Space):地址空间是指用来识别存储在有限内存中的数据有效地址的一系列有效地址。
线性地址:地址空间的寻址方案从字节0开始,在分配的内存最后字节的偏移量结束,这种单一的连续地址空间被称为线性地址空间,其地址被称为线性地址。基于本书讨论的内存模型以及分页管理,本书中会交替使用虚拟地址和线性地址两个术语。
物理地址:本书使用术语物理地址来表述经过处理器请求后,访问物理内存的地址。