您的位置:首页 > 其它

Intel80x86内存寻址

2017-04-28 09:31 253 查看
Intel80x86内存寻址

一、内存地址

地址分为三种:

逻辑地址

使用这种地址指定一个操作数或一条指令的地址,由16位的段(segment)和32位的偏移量(offset)组成

线性地址

32位无符号整型,最高可表示4GB地址,通常用16进制数字表示,值的范围从0x00000000到0xffffffff。

物理地址

用于芯片级内存单元寻址,由32位无符号整数表示

CPU通过分段单元把一个逻辑地址转换为线性地址,接着,分页单元把线性地址转换为物理地址



二、硬件分段单元

从80386开始,Intel处理器能执行两种不同的地址转换模式,为实模式和保护模式。保留实模式是要与早期的CPU保持兼容。下面重点讨论保护模式。

1、段选择符

一个逻辑地址分为段选择符和指定段内相对地址的偏移量,段选择符是一个16位的域,指明段描述符的位置。



s表示段号,g表示在GDT还是LDT中,p表示保护信息。

GDT和LDT中表项个数最多是2的13次方,即8192项。偏移量是32位长的域。为了快速找到段选择符,处理器设置6个段寄存器,cs,ss,ds,es,fs,gs,允许同时访问6个段。

2、段描述符

每个段由8个字节的段描述符表示,它描述了段的特征,显然寄存器存储不了太多的描述符,因此,这些描述符被存放在内存中,包括全局描述符表(GDT)和局部描述符表(LDT)。通常系统中只有一个GDT,而每一个进程可以有自己的LDT,GDT的地址放在gdtr中,LDT地址放在ldtr中。Intel处理器提供了一组非编程的寄存器,供6个可编程的段寄存器使用。每一个非编程的寄存器含有8个字节的描述符,由相应的段寄存器中的段选择符所指定。每当一个段选择符被装入段寄存器,相应的段描述符就被装入对应的寄存器中。



段描述符格式,具体的含义可查官方文档



由于一个段描述符是8个字节长,它在GDT或LDT中的地址可由段选择符的高13位乘8加上gdtr中的基址得出。GDT的第一项总是为0,这样可以保证段选择符为空的逻辑地址被认为是无效的。

3、逻辑地址到线性地址转换

转换步骤如下:



1、确定段表在GDT中还是LDT中

2、由段选择符的索引域计算出段描述符的地址,即索引域值乘8加gdtr或ldtr的值。

3、把逻辑地址的偏移量和描述符基地址域的值相加,就得到了线性地址。

由于寄存器的存在,只有当段寄存器的内容被改变时才需要执行前两步操作。

未完待更。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: