描述符相关的几个系统结构
来源:互联网 发布:淘宝天猫数据分析报告 编辑:程序博客网 时间: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位宽 */
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 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: 这位被软件使用,处理器不使用 */
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
unsigned : 1; /* Bit53: 此位保留不被使用 */
unsigned D : 1; /* D位 Bit54:缺省操作数位指示缺省的操作数大小
1 表示缺省为32位
0 表示缺省为16位 */
#endif
#ifdef SYSTEM_DESCRIPTOR
unsigned : 2; /* Bit53~Bit54:若为系统描述符,将保留 */
#endif
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
} __attribute__((packed) SEG_DESCRIPTOR;
#endif
#ifdef SYSTEM_DESCRIPTOR
} __attribute__((packed) SYS_DESCRIPTOR;
#endif
} __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域
* 代码段中的 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 描述符 */
* 系统描述符类型的定义,共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;
typedef SEG_DESCRIPTOR CODESEG_DESCRIPTOR;
/* 定义数据段描述符结构。S位为1:表示段描述符 */
typedef SEG_DESCRIPTOR DATASEG_DESCRIPTOR;
typedef SEG_DESCRIPTOR DATASEG_DESCRIPTOR;
/* 定义LDT描述符。S位0:表示属系统描述符 */
typedef SYS_DESCRIPTOR LDT_DESCRIPTOR;
typedef SYS_DESCRIPTOR LDT_DESCRIPTOR;
/* 定义TSS描述符。S位0:表示属系统描述符 */
typedef SYS_DESCRIPTOR TSS_DESCRIPTOR;
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 : 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 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位,表示是否被引用 */
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
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
} __attribute__((packed)) INTGATE_DESCRIPTOR;
#endif
#ifdef TASK_GATE_DESCRIPTOR
} __attribute__((packed)) TASKGATE_DESCRIPTOR;
#endif
} __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个参数
- 描述符相关的几个系统结构
- linux系统文件描述符file descriptor与inode的相关知识 , 文件描述符泄露
- C语言中常用到的几个与系统时间相关的结构体及其说明
- 网络socket的描述和相关结构定义
- php几个缓存相关的系统函数
- USB几个描述符的联系
- linux系统文件描述符file descriptor与inode的相关知识
- linux系统文件描述符file descriptor与inode的相关知识
- 与IP地址相关的几个结构体
- 描述符相关的时间定时器
- 介绍Hadoop相关的几个开源系统
- linux信号处理 --和信号相关的几个系统调用
- CentOS系统中与时间相关的几个命令
- Android常用的几个系统参数相关代码片段
- [转]SQLServe 存储表结构的几个系统表
- linux系统编程之基础必备(三):文件描述符file descriptor与inode的相关知识
- linux系统编程之基础必备(三):文件描述符file descriptor与inode的相关知识
- linux系统编程之基础必备(三):文件描述符file descriptor与inode的相关知识
- AMD64 ABI 的几个主要特性
- 保留内存泄漏原因
- x86控制转移及相关的权限检查
- 嵌入式Linux
- TSS的定义
- 描述符相关的几个系统结构
- 段式管理的几个相关寄存器
- char wchar_t WCHAR TCHAR ACHAR
- 清明时节雨纷纷
- Socket在Android中的应用
- mysql下sql语句令某字段值等于原值加上一个字符串
- 漂亮纯css蓝白色横向导航条代码
- hduoj1213:How Many Tables
- 剖析浮点数