保护模式——段寄存器简介与段描述符和段选择子

段寄存器属性简介

段寄存器 Selector Attribute Base Limit
ES 0023 可读、可写 0 0xFFFFFFFF
CS 001B 可读、可执行 0 0xFFFFFFFF
SS 0023 可读、可写 0 0xFFFFFFFF
DS 0023 可读、可写 0 0xFFFFFFFF
FS 003B 可读、可写 0x7FFDE000 0xFFF
GS - - - -

GDT(全局描述符表) LDT(局部描述符表)

LDT表在Windows中并没有使用。
当我们执行类似MOV DS,AX指令时,CPU会查表,根据AX的值来决定查找GDT还是LDT,查找表的什么位置,查出多少数据。
gdtl中存储了gdt表中的长度;gdtr寄存器中存储了GDT表的起始地址。
每次从GDT表中查表:每8个字节为一个段描述符

段描述符

段描述符的结构

保护模式——段寄存器简介与段描述符和段选择子

段描述符与段寄存器的对应关系

  1. 16位的Attribute对应段寄存器中高四字节从8位开始到第23位结束。
  2. 32位的Base包含了三个部分:
    1. 高四字节的第24位到第31部分
    2. 高四字节的第0位到第7位
    3. 低四字节的第16位到31位
  3. 32位的Limit包括两部分一共二十位(最大值为FFFFF):
    1. 高四字节的16位到19位
    2. 低四个字节的0位到15位

P位

P位 位于段描述符的高四个字节的第15位(下标为15)的位置.

P = 1 段描述符有效
P = 0 段描述符无效

当使用指令将段描述符加载至段寄存器的时候,CPU第一个检测的就是P位,当P位为0时就不做继续的检测了。

G位

G位 位于段描述符的高四个字节的第23位(下标为23)的位置。

  1. G=0的时候:表示Limit字段单位是字节:最大值是0x000FFFFF。
  2. G=1的时候:表示Limit字段单位是4KB:最大值是0xFFFFFFFF。

S位

G位 位于段描述符的高四个字节的第12位(下标为12)的位置。

S = 1时表示: 代码段或者数据段描述符
S = 0时表示: 系统段描述符

type域

type域 包含段描述符的高四个字节的8、9、10、11共四位。
保护模式——段寄存器简介与段描述符和段选择子

  1. 当s位为1且当type域中的11位为0时,表示是数据段。
    其中图中的A、W、E分别代表不同的意思

    1. A代表是否访问过。未访问过为0,访问过为1。
    2. W代表是否可写。为0的时候表示不可写,为1的时候表示为可写。
    3. E位表示拓展位,为0表示向上拓展,为1表示向下拓展。
      1. 向上拓展
        红色部分表示地址有效范围。
        保护模式——段寄存器简介与段描述符和段选择子

      2. 向下拓展
        红色部分表示地址有效范围。
        保护模式——段寄存器简介与段描述符和段选择子

  2. 当s位为1且当type域中的11位为1时,表示是代码段。
    其中图中的A、R、C分别代表不同的意思

    1. A代表是否访问过,未访问过为0,访问过为1。
    2. R代表是否可读位,表示该段是否可以读。
    3. C代表一致位:C = 1 表示一致代码段 ,C = 0 表示非一致代码段
  3. 当s位为0的时候,表示该段描述符为系统描述符.系统描述符有分为以下类型:
    保护模式——段寄存器简介与段描述符和段选择子

DPL

两位要么全0,要么全1。

DB

总结

  1. 当GDT中的一个八字节中的第五个字节为5或者为F时才可能是代码段或者数据段。
  2. 当满足第一个总结且GDT中的一个八字节中的第6个字节大于等于8的时候是代码段,小于8是数据段。

段选择子

段选择子是一个16位的段描述符,该描述符指向了定义该段的段描述符.

段选择子和段寄存器的对应关系

对应可见部分的16位既段寄存器中的Selector

段选择子的结构

保护模式——段寄存器简介与段描述符和段选择子

RPL

请求特权级别

TI

TI=0 查GDT表

TI=1 查LDT表

Index

处理器将索引值乘以8再加上GDT或者LDT的基地址,就是要加载的段描述符。