地址映射

来源:互联网 发布:剔除异常数据的方法 编辑:程序博客网 时间:2024/06/05 17:33

1.三种地址(逻辑地址,线性地址,物理地址)

逻辑地址:即逻辑上的地址,实模式下由段基地址+段内偏移”组成;保护模式下由“段选择符+段内偏移”组成。

线性地址:逻辑地址经分段机制后就成线性地址如果不启用分页,那么此线性地址物理地址相同

物理地址:线性地址经分页转换后就成了物理地址。

 

2.最早期的CPU--》8086(只有一种工作方式:实模式)

而且地址总线为20位。实模式下所有寄存器都是16位。

80286开始就有了保护模式,从80386开始CPU地址总线为32位。但是为了兼容以前的,所以保留了实模式。

 

实模式和保护模式的区别:

   保护模式同实模式的根本区别是进程内存受保护与否可寻址空间的区别只是这一原因的果。实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知

 

实模式:

CPU-->8086:

CS寄存器中存的是段基地址)

一次可以处理的位数---ALU一次处理的位数  16---》2^16=64KB

地址总线是20--》2^20=1MB(说明实模式下CPU的最大寻址能力是1MB)

此时寄存器都是16位。

既然有1MB的寻址能力,如何用16位的寄存器去表示?这就引出了分段的概念。

8086 CPU将1MB存储空间分成许多逻辑段,每个段最大限长为64KB(但不一定就是64KB)。这样每个存储单元就可以用“段基地址+段内偏移地址”表示。段基地址由16位段寄存器值左移4位表达,段内偏移表示相对于某个段起始位置的偏移量。

 

保护模式:

CPU-->80386:(在不启用分页机制情况下,此线性地址就是物理地址)

为了兼容,所以还需要分段

(还是需要CS和DS两个16位的寄存器)

CS一分:13位+1位+2位

ALU-->32位

总线-->32位

在定义“逻辑地址”时看到保护模式和实模式的区别在于它是用段选择符而非段基地址

 

段选择符:

 

   1)进行索引,索引值为13位

   2)TI是用来指明GDT(TI=0)还是LDT(TI=1),为2位

   3)RPL表示的是权限,共有4个等级,0位最高,为1位(内核为最高的0级,用户为最低的3级)

  所以从这里看出,在保护模式下最多可以表示2^13=8192个段描述符,而TI又分GDT和LDT(如图3所示),所以一共可以表示8192*2=16384个段描述符,每个段描述符可以指定一个具体的段信息,所以一共可以表示16384个段。而图1看出,段内偏移地址为32位值,所以一个段最大可达4GB,这样16384*4GB=64TB,这就是所谓的64TB最大寻址能力。

 

 

eg:段选择符为0000 1000

 一般只用(GDT:全局描述符表 ---->  GDTR是寄存器,用于存放GDT的地址

           GDT每一项为8字节)

 一般不用(LDT:局部描述符表)

(段描述符表是从0开始编号的)

如上图所示:找到此二进制所表示的十进制数(==8),所以为GDT表中的第二个。

 

段选择符指向的段描述符里有三个部分基地址信息,这三部分组成一个32位地址就决定了段基地址位置,此地址再加上段内偏移最终确定线性地址位置

 

线性地址如果不启用分页,那么此处的线性地址就是物理地址。

 

分页机制:它把物理内存分成相同固定大小的页面,2^12=4KB。每个页面的0~4KB范围由线性地址的低12位表示,线性地址空间的高10位用来指定页目录中的位置,可以选择2^10=1024个目录项,每个目录项为四字节,所以页目录为1024*4B=4KB。每个目录项中的高20位用以查找页表在物理内存中的页面,每个页表含1024个页表项,每个页表项也是四字节,这样一页表也是1024*4B=4KB。所以一个页目录可以查找1024个页表,每个页表为4KB,所以总共可以查找的页表大小为1024*4KB=4MB大。最后每个页表项的高20位用以定位物理地址空间中的某个页基地址,此地址再加上线性地址空间的偏移值就是最后物理内存空间单元。

(页目录是唯一的,它的地址存放在CR3的寄存器中。)

具体转换如下:

1、从cr3中取出进程的页目录地址(操作系统负责在调度进程的时候,把这个地址装入对应寄存器);

2、根据线性地址前十位,找到对应的索引项页目录中的项,是一个页表的地址。页的地址被放到页表中去了。

3、根据线性地址的中间十位,在页表(也是数组)中找到页的起始地址;

4、将页的起始地址与线性地址中最后12位相加,得到最终我们想要的物理地址;

 

 

 

总的来说整个过就是逻辑地址经分段机制变成线性地址,如果不启用分页的情况下,此线性地址就是物理地址;如果启用分页,那么线性地址经分页机制变成物理地址。

原创粉丝点击