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位相加,得到最终我们想要的物理地址;
总的来说整个过就是逻辑地址经分段机制变成线性地址,如果不启用分页的情况下,此线性地址就是物理地址;如果启用分页,那么线性地址经分页机制变成物理地址。