32位系统寻址

来源:互联网 发布:烟台市网络党校打不开 编辑:程序博客网 时间:2024/06/10 07:14

32位cpu(典型的从386开始)可支持实模式、保护模式、虚拟8086模式
在其工作在实模式时,与16位完全一样,20位地址还是要移位得到的,因为在实模式下其不攒在eax等的高16位。
在保护模式下,其还是使用类似“段寄存器:32位偏移量”的寻址。
说先理解几个概念:虚拟地址(逻辑地址)、线性地址、物理地址


一、有线性地址得到物理地址的机制:
(1)如果分页标志位(寄存器CR0的最高位,即位31)为0,表示不采用分页机制,32位物理地址=32位线性地址
(2)如果设置的分页标志位,即表示采用分页机制,此时32位线性地址内容分三部分:如下
位31~0:位31~22(10位)、位21~12(10位)、位11~0(12位)
含义分别是:页目录索引、页表索引、字节索引
先假以名分别称呼为高10位、中10位、低12位

1.32位寄存器CR3(也成页目录寄存器--PDBR)中高20位指出了页目录的物理地址的高20位。页目录物理地址低12位总为0,
页目录的物理地址为【(CR3中高20位基址)0000 0000 0000】

2.页目录为4kb内存块,以4bytes为一个页表描述符(顾名思义就是描述页表信息的内存结构)
可容纳4kb/4bytes=1024=1k个页表的信息描述(其4bytes=32位为页表的物理地址)
那个高10位就是在页目录中找出页表描述符的物理位置的索引,为【高10位*4+32位页目录物理地址】

其连续存放的4bytes=32位内容即为页表的物理地址【4bytes页表描述符表示的32位页表物理地址】

3.页表也是4kb内存块,以4bytes为夜歌页描述符(同理顾名思义就是描述页的信息的内存结构)
可容纳4kb/4bytes=1024=1k个页的信息描述(其4bytes=32位为页的物理地址),
那个中10位就在是页表中找出页描述符的物理位置的索引,为【中10位*4+位页表物理地址】
其连续存放的4bytes=32位内容即为页的物理地址【4bytes页描述符表示的32位页物理地址】

页为4kb内存块

4.CR3低12位表示在页中的字节偏移量,加上页的物理地址后就是内存单元的物理地址


=====================================================================
以上解决了线性地址到物理地址的转换

二、那怎么有虚拟地址(或称逻辑地址)得到线性地址呢?如下
16位段寄存器:32位偏移量==》即表示逻辑地址或称虚拟地址
在32位保护模式段寄存器还是16位,但其不直接表示段的起始地址
16位段寄存器内容可分为三部分:位15~3(13位)、位2、位1~0
其意涵分别为:段描述符索引、描述符表标志、特权控制
386以上cpu中有这么几个寄存器:GDTR、LDTR、IDTR
分别称为全局描述符表寄存器、局部描述符表寄存器、中断描述符表寄存器
(其中GDTR、IDTR是48位的LDTR是16位的,
你只需知道这几个硬部件指定了全局描述符表、局部描述符表、中断描述符表的线性地址)
这三个描述符表中每8bytes表示一个段描述符(顾名思义,描述段的信息的内存结构)(64bit)
【(16位段寄存器高13位)000】即为段描述符在描述表中的位置,段描述符(8bytes内存结构)中有32位段基址,这加上32位偏移量就得到线性地址
(从哪个表中找呢,位3为1时从局部描述符表找,0时从全局描述符表找)

这就解决虚拟地址到线性地址的转换

 

三、总结
=====================================================================
32位汇编中:
逻辑地址===(GDTR等)===》线性地址====(分页机制转换)=====》物理地址
16位汇编:
逻辑地址=====(简单转换)====》物理地址

===============
顺便说句,16位有段有64k限制,内存有1M限制(当然还有各种扩展技术可以实现访问大于1M的高端地址内存),在32位中段的大小可大至4GB(甚至64GB,有些32位cpu其地址线是36位的),通常都是"平坦“模式,一个段常常ds,cs,ss指向的段描述符其基地址都是0开始,段限长都是4GB,即同一个段。阿门。。。。