1.段描述符与段选择子
80386中段寄存器分別有:
ES CS SS DS FS GS LDTR TR
共96位,其中有16位是可見的,80不可見
至于為什么是96位下面有講
mov dword ptr ds:[0x80000000],eax
這段代碼執行后就出現異常,段描述符 屬性決定了它能不能讀寫
3~15位為段選擇子
此時的ds的為:0x002B,拆成二進制為:
0000000000101 0 11
RPL位為所在的級別:r0,r1,r2,r3。Ti位為0時在GDT中,1時在LDT中
GDT :48位(全局描述符表)LDT(局部描述符表)
LDT只能嵌套的存在GDT中。
GDTR是寄存器,存放著gdt表的基址,GDTL也在gdtr中它指名了gdt表的大小
段描述符的位置 = gdtr首地址 + ds高13位 * 8 。
gdtr一段8字節所以*8
ds.selecter:0x23 00100 0 11
查gdtr:gdtrBase+4*8
段描述符結構:
ds.Base = 00cff300`0000ffff
第一個字節00為段基地址,第四個字節00也為段基地址,結合圖看吧…
后面四個字節0000ffff分別為基地址,段限長
3個紅部分base:00 00 0000
attr:c f 3
顆粒位G 1時Limit值的單位是4KB,0時Limit值的單位是B
2個藍部分limit:(0xffff f+1) * 0x1000 - 1 = ffffffff
g位0:fffff補3個0,g位1:fffff補3個f
Base:00000000 共32位
Atrributes :cf3 共16位,不夠前面補0補夠為止
LinIT:(0xffff f+1) * 0x1000 - 1 = ffffffff 共32為
80+16(可見部分)=96位
**LLDT:**這玩意可以有多個
加載:lldt 0080
假如:ds為0x27轉二進制:00100 1 11
讀取gdt指令:sgdtL:寫lgdt
ldt:sldt/lldt
3環只能讀不能寫它
總結
以上是生活随笔為你收集整理的1.段描述符与段选择子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python封装一个效率极高的 批量更新
- 下一篇: 2.探测段寄存器