IA-32 Intel手册学习笔记(二)保护模式下的内存管理

内存管理概述(Memory Management Overview)

Inter体系结构的内存管理可分为两部分:分段和分页。

  • 分段提供了一种机制,这种机制可以为每个程序或者任务提供单独的代码、数据和栈模块,这就保证了多个进程或者任务能够在同一个处理器上运行而不互相干扰。
  • 分页机制提供了虚拟内存系统,在这种系统中,程序的执行代码按需要被映射到物理内存中。分页机制同样可以用来隔离多个任务。
  • 在保护模式下,分段机制是必须的,分页机制是可选的

分段机制将处理器可寻址空间(即线性空间)分成若干个较小的受保护的地址空间段。段可以用来装载程序的代码,数据或者堆栈,也可以用来装载系统的数据结构(如TSS、LDT等)。当处理器上运行多个进程时,操作系统为每个进程分配属于它自己的段,同时处理器会规定这些段的边界,保证一个进程不会对另一个进程的段进行读写造成干扰。

系统中所有的段都在处理器的线性地址空间内,但是只有逻辑地址才能确定一个字节在特定段中的位置。所以在实际程序访问内存时,需要有某种机制将逻辑地址映射到线性地址。逻辑地址由段选择符和偏移量组成。通过段选择符,可以在全局/局部描述符表(GDT/LDT)中唯一定位一个段描述符,每个段描述符记录一个段在线性地址空间的基地址,然后通过和偏移量相加,得到实际的线性地址。

在保护模式下,段选择符其实就是CS寄存器,是16位的。偏移量是EIP寄存器,是32位的。上述过程其实就是将CS中16位的逻辑地址映射成32位的线性地址。

IA-32 Intel手册学习笔记(二)保护模式下的内存管理_第1张图片


段的使用(Using Segments)

intel架构所使用的分段机制被用来实现各种不同的系统设计

基本平坦模型(Basic Flat Model)

  • 仅仅利用分段来保护程序。操作系统和应用程序可以访问一个连续的,没有分段的地址空间,即使所访问的地址处并没有物理内存时,也不会产生“超出内存范围”异常

受保护的平坦模型(Protected Flat Model)

  • 和基本平坦模型类似,只是段限长被设定为实际物理内存范围内,如果试图访问实际内存以外的地址,会产生一个通用保护异常

多段模型(Multi-Segment Model)

  • 充分利用了分段机制,提供了对代码,数据结构以及程序的硬件级的强制保护。在这里,每个进程拥有自己的段描述符表及自己的段。LDT?

逻辑地址和线性地址(Logical And Linear Address)

逻辑地址

  • 相对于该进程所在段基地址的偏移地址,应用程序直接使用的其实就是逻辑地址,而不需要关心分段分页机制转换的物理地址。逻辑地址由16位的段选择符(CS)和一个32位的偏移量(EIP)组成。

线性地址

  • 作为逻辑地址和物理地址转换的一个桥接。逻辑地址是偏移量,段描述符中的地址是基地址,二者相加的结果是线性地址。线性地址是32位地址,地址空间中包含了所有的段以及为系统而定义的各种系统表

物理地址

  • 实际内存中的地址,即地址总线上的寻址。如果没有采用分页机制,那么线性地址就是物理地址。如果采用分页机制,那么需要通过页目录和页表转换成物理地址。32位机器总共有32根地址总线,实际物理地址内存空间为4GB,即2的32次方

三者之间的转换关系如下

  • 通过逻辑地址中的段选择符,在GDT或LDT中定位该段的段描述符(仅当一个新的段选择符被读入段寄存器时才执行这一步?)
  • 检查段描述符中的访问权限和段的地址范围以确保该段是可访问的,即偏移量在段限长范围内
  • 将段描述符中的段基址与偏移量相加构成线性地址
  • 如果没有采用分页,那么线性地址就是物理地址,否则,需要根据页目录和也表将线性地址转换成物理地址

段选择符
段选择符是一个16位的段标识符,它并不直接指向该段,而是指向定义该段的段描述符。段选择符其实就是CS : EIP中的CS。一个段选择符包含一下项目

  • Index索引,在3-15位。标识对应的段描述符在GDT/LDT中的索引,寻址时索引 * 8 + GDT/LDT的基地址就可以找到对应的段描述符
  • TI标记,在第2位。用于标识使用哪一个描述符表,0表示GDT,1表示LDT
  • RPL请求的特权级,在0-1位。确定该选择符的特权级。特权级从0-3,0为最高特权级(内核),3为最低特权级(用户)

IA-32 Intel手册学习笔记(二)保护模式下的内存管理_第2张图片

段描述符
段描述符是一个64位的段标识符,占8个字节,位于GDT/LDT中,其中的标志和字段如下

  • 段限长字段,指定了段的大小。
  • 基地址域,该描述符指向的段内存的基地址
  • 类型域,指明段或者门的类型,确定段的范围权限和增长方向
  • S(描述符类型)标志,确定段描述符是系统描述符或者代码(S标记为0时),数据段标识符(S标记为1时)
  • DPL(描述符特权级)域,指明该段的特权级,特权级从0-3。0为最高特权级,DPL用来控制对该段的访问
  • P(段存在)标志,指出该段是否在内存中(1表示在内存中,0表示不在内存中)
  • D/B(默认操作数大小/默认栈指针大小/上限)标志,根据这个段描述符所指的是一个可执行代码段,一个向下扩展的数据段还是一个堆栈段,这个标志完成不同的功能
  • G(粒度)标志,确定该段限长扩展的增量
  • 可用及保留的为s

IA-32 Intel手册学习笔记(二)保护模式下的内存管理_第3张图片

GDT中的第一项是空,不能被使用,如果使用该项访问内存,处理器会产生一个异常


分页机制(Paging Modes)

分页机制提供了一种虚拟内存环境,虚拟内存通过一个较小的物理内存以及磁盘空间来模拟一个很大的线性地址空间。在分页机制下,每个段被分成很多页(通常一个页的大小是4KB),这些页或者在物理内存中,或者在磁盘上。操作系统会维护一个页目录和一组页表来跟踪这些页。当一个进程试图访问线性地址空间的一个地址时,处理器会通过页目录和页表将线性地址映射成物理地址,然后对其进行操作(读或写)。如果被访问的页不在当前的物理内存中,处理器会从磁盘上读取缺少的这页到物理内存中,接着执行操作。

处理器用来映射线性地址到物理地址的信息和产生缺少缺页异常的信息都在页目录和页表中,页目录和页表都在内存中。

为了减少地址转换所使用的总线周期,最近被访问过的页目录和页表项都被缓存在一个叫做转换后备缓冲区(translation lookaside buffers, TLBs)的设备中。TLBs可以满足多数的读当前页目录和页表的请求而不占用总线周期。仅当所访问的页表项不在TLBs中时,才需要额外的总线周期。

分段和分页有本质的不同

  • 分页使用固定大小的页面,页有固定的尺寸。一个进程的数据结构可以部分在内存,部分在磁盘
  • 分段的每个段的大小不固定,与它所持有的代码,数据总和有关。如果仅仅使用分段作为唯一的地址转换形式,一个进程的数据结构必须全部在物理内存中

如果没有采用分页机制,那么线性地址就是物理地址。

页表和页目录
当启动分页机制时,处理器用来进行线性地址到物理地址转换的信息都包含在4个数据结构中

  • 页目录,一个由32位页目录项组成的数组。它被放在一个4KB的页中,页目录最多包含1024个页目录。
  • 页表,一个由32位页表项组成的数组。它存放在一个4KB的页中,页表最多包含1024个页表项。对于2MB和4MB的页,不适用页表。这些页直接从一个或者更多的页目录项映射。
  • 页,一个4KB,2MB或者4MB的平坦地址空间。
  • 页目录指针表,由4个64位的项组成的数组,每一项都指向一个页目录。仅当启用物理地址扩展时才使用这个数据结构。

你可能感兴趣的:(操作系统)