存储段
描述符 |
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 |
|
|
根据存储段描述符的结构,可定义如下的汇编语言描述符结构类型:
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 表的位置