描述符相关的几个系统结构

来源:互联网 发布:淘宝天猫数据分析报告 编辑:程序博客网 时间:2024/04/29 17:57

 转自:点击打开链接

/* author: mik
 * project: pm_simulation (一个保护模式行为模拟器)
 *
 * descriptor.h 这个文件描述段管理的几个相关寄存器的结构
 */
 
#ifndef __DESCRIPTOR__
#define __DESCRIPTOR__
 
 
 
/* 通用的段描述符结构,共8个字节64位宽 */
typedef struct descriptor {
    unsinged limit_low : 16;         /* 段长低16位 Bit0~Bit15: 2个字节宽 */
    unsigned base_low : 24;          /* 段基址低24位 Bit16~Bit39: 24位宽 */
 
#if 0     /* 不需要 packed */
    unsigned base_low16 : 16;        /* 段基址低16位 Bit16~Bit31: 16 位宽 */
    unsigned base_next8 : 8;         /* 段基址的16~23位 Bit32~39: 8 位宽 */  
#endif
 
    unsigned type : 4;               /* 段类型 Bit40~Bit43: 4位表示段的类型 */
    unsigned S : 1;                  /* 系统段 Bit44: 0 表示系统描述符
                                                     1 表示段描述符 */
    unsigned DPL : 2;                /* 描述符权限 Bit45~Bit46: 访问段所需的权限 */
    unsigned P : 1;                  /* Preset 位 Bit47: 表示是否引用过 */
    unsigned limit_high : 4;         /* 段长高4位 Bit48~Bit51: 段长共20位 */
    unsigned AVL : 1;                /* AVL位 Bit52: 这位被软件使用,处理器不使用 */
 
#ifdef SEGMENT_DESCRIPTOR
    unsigned  : 1;                   /* Bit53: 此位保留不被使用 */
    unsigned D : 1;                  /* D位 Bit54:缺省操作数位指示缺省的操作数大小
                             1 表示缺省为32位
                              0 表示缺省为16位 */
#endif
 
#ifdef SYSTEM_DESCRIPTOR
    unsigned  : 2;                   /* Bit53~Bit54:若为系统描述符,将保留 */
#endif

    unsigned G : 1;                  /* G位 Bit55:粒度位,0 表示粒度为字节
                                                        1 表示粒度为 4K 字节*/
    unsigned base_high : 8;          /* 段基址高8位 Bit56~Bit63: 共32位段基址 */
 
#ifdef SEGMENT_DESCRIPTOR
} __attribute__((packed) SEG_DESCRIPTOR;
#endif
 
#ifdef SYSTEM_DESCRIPTOR
} __attribute__((packed) SYS_DESCRIPTOR;
#endif
 
/*
 * 代码段类型的定义,共4位,对于应代码段的type域
 * 代码段中的 conforming 类型,表示允许执行高权限的目标代码
 *
 * 例:1100 (0xC) ---- 类型为:Conforming,Exceute-Only
 */
#define EO    0x08                  /* Nonconforming,Exceute-Only */
#define EA    0x09                  /* Nonconforming,Exceute-Only & Accessed */
#define ER    0x0A                  /* Nonconforming,Exceute/Readable */
#define ERA   0x0B                  /* Nonconforming,Exceute/Readable & Accessed */
#define CEO   0x0C                  /* Conforming,Exceute-Only */
#define CEA   0x0D                  /* Conforming, Exceute & Accessed */
#define CER   0x0E                  /* Conforming, Exceute/Readable */
#define CERA  0x0F                  /* Conforming, Exceute/Readable & Accessed */

/*
 * 数据段类型的定义,共4位,对应于数据段的type域
 * Expand-down 类型的数据段,表示向下生长,通常用于stack段
 * D位为 1 时,esp 参考 32 位栈,0 时,sp 参考 16 位栈
 *
 * 例: 0010 (0x02) ---- 类型表示为:Expand-Up, Read/Write
 */
#define RO    0x00                  /* Read-Only */
#define ROA   0x01                  /* Read-Only & Accessed */
#define RW    0x02                  /* Read/Write */
#define RWA   0x03                  /* Read/Write & Accessed */
#define ERO   0x04                  /* Expand-down,Read-Only */
#define EROA  0x05                  /* Expand-down,Read-Only & Accessed */
#define ERW   0x06                  /* Expand-down,Read/Write */
#define ERWA  0x07                  /* Expand-down,Read/Write & Accessed */
 
/*
 * 系统描述符类型的定义,共4位,对应于各种系统描述符的 type 域 */
 *
 * 0x00、0x08、0x0A 及 0x0D 值是保留值
 */
#define A_TSS16    0x01             /* 可使用(Avaliable)的 16 位TSS描述符 */
#define A_LDT      0x02             /* LDT 描述符 */
#define B_TSS16    0x03             /* 不可使用(Busy)的16位TSS描述符 */
#define C_GATE16   0x04             /* 16位call gate 描述符 */
#define T_GATE     0x05             /* Task gate 描述符 */
#define I_GATE16   0x06             /* 16位Interrupt gate 描述符 */
#define TP_GATE16  0x07             /* 16位Trap gate 描述符 */
#define A_TSS32    0x09             /* 可使用(Avaliable)的32位TSS描述符 */
#define B_TSS32    0x0B             /* 不可使用(Busy)的32位TSS描述符 */
#define C_GATE32   0x0C             /* 32位call gate 描述符 */
#define I_GAET32   0x0E             /* 32位Interrupt gate描述符 */
#define TP_GATE32  0x0F             /* 32位Trap gate 描述符 */
 
 
 
/* 定义代码段描述符结构。S位为1:表示段描述符 */
typedef SEG_DESCRIPTOR CODESEG_DESCRIPTOR;    
 
/* 定义数据段描述符结构。S位为1:表示段描述符 */
typedef SEG_DESCRIPTOR DATASEG_DESCRIPTOR;
 
/* 定义LDT描述符。S位0:表示属系统描述符 */
typedef SYS_DESCRIPTOR LDT_DESCRIPTOR;
 
/* 定义TSS描述符。S位0:表示属系统描述符 */
typedef SYS_DESCRIPTOR TSS_DESCRIPTOR;
 
 
 
/* 定义 gate descriptor 结构 */
typedef strcut gate_descriptor {
 
#ifdef TASK_GATE_DESCRIPTOR
    unsigned : 16;                  /* Task 门符将保留此域 */
#else
    unsigned offset_low : 16;       /* 目标代码的偏移量低16位 */
#endif
 
    unsigned selector : 16;         /* 目标代码段的选择子 */
 
#ifdef CALL_GATE_DESCRIPTOR
    unsigned para_count : 5;        /* 若为call门符,则为参数数目 */
#else
    unsigned  : 5;                  /* Interrupt和Task门符,则保留 */
#endif
 
    unsigned  : 3;                  /* 保留 */
    unsigned type : 4;             /* 门符类型 */
    unsigned S : 1;                 /* 系统属性,固定为 0 */
    unsigned DPL : 2;               /* 访问目标代码段的权限 */
    unsigned P : 1;                 /* present位,表示是否被引用 */
 
#ifdef TASK_CATE_DESCRIPTOR
    unsigned : 16;                  /* Task 门符将保留此域 */
#else
    unsigned offset_high : 16;      /* 目标代码的偏移量高16位 */
#endif

#ifdef CALL_GATE_DESCRIPTOR
} __attribute__((packed)) CALLGATE_DESCRIPTOR;
#endif
 
#ifdef INTERRUPT_GATE_DESCRIPTOR
} __attribute__((packed)) INTGATE_DESCRIPTOR;
#endif
 
#ifdef TASK_GATE_DESCRIPTOR
} __attribute__((packed)) TASKGATE_DESCRIPTOR;
#endif
 
 
 
 
 
#endif   /* end of file */
 
 
 
一、描述符结构
   描述符两2种:段描述符,如:CS、DS、ES、FS、GS 及 SS 引用的描述符。
              系统描述符,如:LDT、TSS 及各种门符(call gate、interrupt gate、task gate)
   描述符结构在32位下,是8字节64位宽。用来描述各种段及相关的门。门符相当于一个指针。
 
 
1、代码段描述符
   limit 域:被分解为2部分被定义在 descriptor 里,共20位。低16位在Bit0~Bit15,高4位在Bit48~Bit51。当描述符被加载到段寄存器的limit 域里时,会自动扩展为32位的limit值。
   base 域: 同样分解为2部分定义在 descriptor 里,共32位。低24位在Bit16~Bit39。高4在Bit56~Bit63。
   type 域:共4位,代表代码段的属性。这4位分别对应:1CRA = 1:固定为1代表是代码段,拥有Exceute 属性
                                                     C:置1时,是 conforming 类型
                                                     R: 置1时,是 Readable 类型
                                                     A: 置1时,是 Accessed 被访问过
     S 域: 0 表示:系统描述符,此处固定为1,代表是段描述符类型
    DPL 域: 描述符权限级别,代表目标代码段运行需要的权限级别
     P 域: 表示被描述符引用的段被加载。
    AVL 域 : 此位保留给系统软件使用。
     D 域: 缺省的操作数大小,1 代表示 32位,0代表16位。
     G 域: 段限的粒度,0表示1byte为单位,1表示4Kbyte为单位。
 
2、数据段描述符
   数据段描述符与代码段描述符拥有相同的位域,区别在于 type 域的不同,表示各代表的类型属性不同。
   type 域:共4位,分别对应于: 0EWA = 0:固定为0代表是数据段,拥有 Readable 属性
                                    E:置1时,Expand-down 向下扩展,通常用于 stack
                                    W: 置1时,表示 Writeable。
                                    A: 置1时,是 Accessed 被访问过
 
 
3、系统描述符
   包括:LDT 描述符、TSS 描述符 及各种门符
 
1) lDT 描述符
   LDT 描述符与段描述符的区别:
   S 域: 固定为0,表示属于系统描述符。
   D 域: D 域在 LDT 描述符里被保留无用。
   type 域:A_LDT 值代表为 LDT 描述符。
 
2) TSS 描述符
   TSS 描述符与 LDT 描述符除了 type 不同外,其余都相同的。
   type 域: TSS 分16位与32位及可用与不可用属性,分别对应A_TSS16、B_TSS16、A_TSS32及B_TSS32。
 
 
3) call gate 描述符
   几个门符位域都不相同。call gate 门符
   count 域:这是个参数个数值,共5位,可传送最多31个参数

原创粉丝点击