Intel80x86内存寻址

来源:互联网 发布:苹果系统删除软件 编辑:程序博客网 时间:2024/05/22 13:37

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、把逻辑地址的偏移量和描述符基地址域的值相加,就得到了线性地址。

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

未完待更。。。

0 0