现在的位置: 首页 > 综合 > 正文

浅析内存管理

2013年12月07日 ⁄ 综合 ⁄ 共 2391字 ⁄ 字号 评论关闭

一、内存地址

  在任何一台计算机上,都存在一个程序能产生的内存地址的集合。当程序执行这样一条指令时:
  MOVE REG,ADDR
  它把地址为ADDR(假设为10000)的内存单元的内容复制到REG中,地址ADRR可以通过索引、基址寄存器、段寄存器和其它方式产生。

  在8086的实模式下,把某一段寄存器左移4位,然后与地址ADDR相加后被直接送到内存总线上,这个相加后的地址就是内存单元的物理地址,而程序中的这个地址就叫逻辑地址(或叫虚地址)。在80386的保护模式下,这个逻辑地址不是被直接送到内存总线,而是被送到内存管理单元(MMU)。MMU由一个或一组芯片组成,其功能是把逻辑地址映射为物理地址,即进行地址转换,如下图所示。

Pic01

 

1、逻辑地址:机器语言指令用这种地址指定一个操作数的地址或一条指令的地址。

 

2、线性地址:线性地址是一个32位的无符号整数,可以表达高达232(4GB)的地址。通常用16进制表示线性地址,其取值范围为0x00000000~0xffffffff。

 

3、物理地址:也就是内存单元的实际地址,用于芯片级内存单元寻址。物理地址也由32位无符号整数表示。

 

下图是MMU单元,它包含两个部分,一个是分段部分,一个是分页部分,分别对应分段机制和分页机制。分段机制将一个逻辑地址对应成一个线性地址,而分页机制将一个线性地址对应成一个物理地址。

Pic02

 

二、分段机制

在80386的段机制中,逻辑地址由两部分组成,即段地址(选择符)部分及偏移地址部分。

 

在实模式下,段寄存器保存着20位段基地址的高16位,所以其值左移4位与16位的偏移地址相加即可得到20位地址,实模式下也就能访问1MB的内存空间。在保护模式下,16位段寄存器的内容是段选择器,段选择器指向段描述符,由段描述符中取出32位段基地址;32位偏移地址由各种32位寻址方式得到,基地址加上偏移地址就得到线性地址。

 

段是形成逻辑地址到线性地址转换的基础。如果我们把段看成一个对象的话,那么对它的描述如下:

(1) 段的基地址(Base Address):在线性地址空间中段的起始地址。

(2)段的界限(Limit):表示在逻辑地址中,段内可以使用的最大偏移量。

(3)段的属性(Attribute): 表示段的特性。例如,该段是否可被读出或写入,或者该段是否作为一个程序来执行,以及段的特权级等等。

段的界限定义逻辑地址空间中段的大小。段内在偏移量从0到limit范围内的逻辑地址,对应于从Base到Base+Limit范围内的线性地址。在一个段内,偏移量大于段界限的逻辑地址将没有意义,使用这样的逻辑地址,系统将产生异常。另外,如果要对一个段进行访问,系统会根据段的属性检查访问者是否具有访问权限,如果没有,则产生异常。例如,在80386中,如果要在只读段中进行写入,80386将根据该段的属性检测到这是一种违规操作,则产生异常。

 

 段的基地址、界限及保护属性,存储在段描述符中,在虚拟—线性地址转换过程中要对描述符进行访问。段描述符又存储在存储器的段描述符表中,该描述符表是段描述符的一个数组。

 

一个段描述符指出了段的32位基地址和20位段界限(即段长),关于段描述符:点此进入 

 

三、分页机制

 分页机制是80x86内存管理机制的第二部分。它在分段机制的基础上完成虚拟(逻辑)地址到物理地址转换的过程。分段机制把逻辑地址转换成线性地址,而分页则把线性地址转换成物理地址。分页可以用于任何一种分段模型。处理器分页机制会把线性地址空间(段已映射到其中)划分成页面,然后这些线性地址空间页面被映射到物理地址空间的页面上。分页机制有几种页面级保护措施,可和分段机制保护机制合用或替代分段机制的保护措施。

 

我们通过设置控制CR0寄存器的PG位可以启用分页机制。如果PG=1,则启用分页操作。如果PG=0,则禁用分页机制,此时分段机制产生的线性地址被直接用作物理地址。

 

 页的大小可以为4KB、2MB、4MB,最常用的是4KB。在4KB情况下,32位的线性地址被分为了三部分。

32位地址的高10位称为页目录索引, 次10位称为页表索引、余下的12位为偏移。如果只取前20位,末位补0,那么其可能指向的的地址都是4KB对齐的,也就是页的基地址。所以32位中的前20位定位了页基地址,而最后12位定位了页内偏移

在地址转换过程中,涉及一个关键的系统寄存器CR3寄存器。CR3寄存器中的高20位存放了页目录索引在物理内存中的位置。

 

地址转换过程如下:

1、从CR3寄存器的高20位中取出地址,末位补0,构成一个32位地址,此地址是页目录所在物理内存的基地址。

2、以线性地址中高10位的页目录索引中的数据为偏移,加上上一步找到的基地址,在页目录中找到相应的页目录项(PDE)

3、页目录项中包括了页表的基地址,根据线性地址中的页表索引,找到页表项(PTE)

4、页表项中存储的是物理地址空间中的页面的基地址(PFN) ,如果PFN指向的页面是无效的,那么会在系统内核中引起页错误,系统内核会进行页面调度,将需要访问的页面从硬盘交换到物理内存中,使PFN指向的页有效。

5、现在已经找到线性地址对应物理地址所在页面的基地址,在该物理页地址基础上加上页内偏移,可得到线性地址与物理地址的对应。

 

四、两种机制的差别

1、页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。

段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。

2、页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。

段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。

【上篇】
【下篇】

抱歉!评论已关闭.