转自:点击打开链接
/* 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个参数