[操作系统]存储段描述符
存储段
描述符
m+7
m+6
m+5
m+4
m+3
m+2
m+1
m+0
Base(31...24)
Attributes
Segment Base(23...0)
Segment Limite(15...0)
存储段
描述符
属 性
Byte m+6
Byte m+5
BIT7
BIT6
BIT5
BIT4
BIT3
BIT2
BIT1
BIT0
BIT7
BIT6
BIT5
BIT4
BIT3
BIT2
BIT1
BIT0
G
D
0
AVL
Limit(19...16)
P
DPL
DT1
TYPE
数据段
类 型
类型值
说 明
0
只读
1
只读、已访问
2
读/写
3
读/写、已访问
4
只读、向下扩展
5
只读、向下扩展、已访问
6
读/写、向下扩展
7
读/写、向下扩展、已访问
代码段
类 型
类型值
说 明
8
只执行
9
只执行、已访问
A
执行/读
B
执行/读、已访问
C
只执行、一致码段
D
只执行、一致码段、已访问
E
执行/读、一致码段
F
执行/读、一致码段、已访问
根据存储段描述符的结构,可定义如下的汇编语言描述符结构类型:
DESC STRUC LIMITL DW 0 ;段界限低16位
BASEL DW 0 ;基地址低16位
BASEM DB 0 ;基地址中间8位
ATTRIB DB 0 ;段属性
LIMITH DB 0 ;段界限的高4位(包括段属性的高4位)
BASEH DB 0 ;基地址的高8位
DESC ENDS
示例:
gdt:
gdt_null: ; 这是CPU要求保留的,CPU要求第一个段必须是空段,空描述符的64位全是0
dd 0
dd 0 ; 每个段的描述符是64位(8字节),dd表示4个字节,两个dd刚好8个字节,
gdt_code_addr equ $ - gdt ; 求得代码段在GDT表中的位置
gdt_code:
dw 0xFFFF ; 段低16位
dw 0 ; 基地址(24位)
db 0
db 10011010b ; 0x9A 属性描述位,P=1,DPL=0,DT1=1,TYPE=A,指明此是 代码段、可读可执行
db 11001111b ; 0xCF 0xC为属性描述表示G=1,D=1 ,AVL=0,表示 段界以4K为单位,32位代码段 ,0xF为段界高8位
; 得出:段界为0xFFFFF,因G=1所以表示4G空间
db 0
gdt_data_addr equ $ - gdt ; 求得数据段在GDT表中的位置,段界、其它属性分析与上同
gdt_data:
dw 0xFFFF
dw 0
db 0
db 10010010b ; 0x92 属性描述位,P=1,DPL=0,DT1=1, TYPE=2,指明此是数据段,可读可写
db 11001111b
db 0
gdt_end:
gdt_addr:
dw gdt_end - gdt - 1 ; GDT 表的大小
dd gdt ; GDT 表的位置