《Orange’s 一个操作系统的实现》3.保护模式1----pm.inc分析
1.pm.inc定義了描述符、選擇子及相關(guān)位數(shù)的取值
; 描述符圖示
; 圖示一
;
;? ------ ┏━━┳━━┓高地址
;???????? ┃ 7? ┃ 段 ┃
;???????? ┣━━┫??? ┃
;????????????????? 基
;? 字節(jié) 7 ┆??? ┆??? ┆
;????????????????? 址
;???????? ┣━━┫ ② ┃
;???????? ┃ 0? ┃??? ┃
;? ------ ┣━━╋━━┫
;???????? ┃ 7? ┃ G? ┃
;???????? ┣━━╉──┨
;???????? ┃ 6? ┃ D? ┃
;???????? ┣━━╉──┨
;???????? ┃ 5? ┃ 0? ┃
;???????? ┣━━╉──┨
;???????? ┃ 4? ┃ AVL┃
;? 字節(jié) 6 ┣━━╉──┨
;???????? ┃ 3? ┃??? ┃
;???????? ┣━━┫ 段 ┃
;???????? ┃ 2? ┃ 界 ┃
;???????? ┣━━┫ 限 ┃
;???????? ┃ 1? ┃??? ┃
;???????? ┣━━┫ ② ┃
;???????? ┃ 0? ┃??? ┃
;? ------ ┣━━╋━━┫
;???????? ┃ 7? ┃ P? ┃
;???????? ┣━━╉──┨
;???????? ┃ 6? ┃??? ┃
;???????? ┣━━┫ DPL┃
;???????? ┃ 5? ┃??? ┃
;???????? ┣━━╉──┨
;???????? ┃ 4? ┃ S? ┃
;? 字節(jié) 5 ┣━━╉──┨
;???????? ┃ 3? ┃??? ┃
;???????? ┣━━┫ T? ┃
;???????? ┃ 2? ┃ Y? ┃
;???????? ┣━━┫ P? ┃
;???????? ┃ 1? ┃ E? ┃
;???????? ┣━━┫??? ┃
;???????? ┃ 0? ┃??? ┃
;? ------ ┣━━╋━━┫
;???????? ┃ 23 ┃??? ┃
;???????? ┣━━┫??? ┃
;???????? ┃ 22 ┃??? ┃
;???????? ┣━━┫ 段 ┃
;
;?? 字節(jié)? ┆??? ┆ 基 ┆
; 2, 3, 4
;???????? ┣━━┫ 址 ┃
;???????? ┃ 1? ┃ ① ┃
;???????? ┣━━┫??? ┃
;???????? ┃ 0? ┃??? ┃
;? ------ ┣━━╋━━┫
;???????? ┃ 15 ┃??? ┃
;???????? ┣━━┫??? ┃
;???????? ┃ 14 ┃??? ┃
;???????? ┣━━┫ 段 ┃
;
; 字節(jié) 0,1┆??? ┆ 界 ┆
;
;???????? ┣━━┫ 限 ┃
;???????? ┃ 1? ┃ ① ┃
;???????? ┣━━┫??? ┃
;???????? ┃ 0? ┃??? ┃
;? ------ ┗━━┻━━┛低地址
;
; 圖示二
; 高地址………………………………………………………………………低地址
; |?? 7?? |?? 6?? |?? 5?? |?? 4?? |?? 3?? |?? 2?? |?? 1?? |?? 0??? |
; |7654321076543210765432107654321076543210765432107654321076543210|??? <- 共 8 字節(jié)
; |--------========--------========--------========--------========|
; ┏━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┓
; ┃31..24┃?? (見下圖)?? ┃???? 段基址(23..0)??? ┃ 段界限(15..0)┃
; ┃????? ┃????????????? ┃????????????????????? ┃????????????? ┃
; ┃ 基址2┃③│②│??? ①┃基址1b│?? 基址1a???? ┃??? 段界限1?? ┃
; ┣━━━╋━━━┳━━━╋━━━━━━━━━━━╋━━━━━━━┫
; ┃?? %6 ┃? %5? ┃? %4? ┃? %3? ┃???? %2?????? ┃?????? %1???? ┃
; ┗━━━┻━━━┻━━━┻━━━┻━━━━━━━┻━━━━━━━┛
;???????? │??????????????? \_________
;???????? │????????????????????????? \__________________
;???????? │???????????????????????????????????????????? \________________________________________________
;???????? │????????????????????????????????????????????????????????????????????????????????????????????? \
;???????? ┏━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┓
;???????? ┃ 7? ┃ 6? ┃ 5? ┃ 4? ┃ 3? ┃ 2? ┃ 1? ┃ 0? ┃ 7? ┃ 6? ┃ 5? ┃ 4? ┃ 3? ┃ 2? ┃ 1? ┃ 0? ┃
;???????? ┣━━╋━━╋━━╋━━╋━━┻━━┻━━┻━━╋━━╋━━┻━━╋━━╋━━┻━━┻━━┻━━┫
;???????? ┃ G? ┃ D? ┃ 0? ┃ AVL┃?? 段界限 2 (19..16)? ┃? P ┃?? DPL??? ┃ S? ┃?????? TYPE?????????? ┃
;???????? ┣━━┻━━┻━━┻━━╋━━━━━━━━━━━╋━━┻━━━━━┻━━┻━━━━━━━━━━━┫
;???????? ┃????? ③: 屬性 2????? ┃??? ②: 段界限 2????? ┃?????????????????? ①: 屬性1????????????????? ┃
;???????? ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━┛
;?????? 高地址????????????????????????????????????????????????????????????????????????????????????????? 低地址
;
;
; 說明:
;
; (1) P:??? 存在(Present)位。
;??????? P=1 表示描述符對地址轉(zhuǎn)換是有效的,或者說該描述符所描述的段存在,即在內(nèi)存中;
;??????? P=0 表示描述符對地址轉(zhuǎn)換無效,即該段不存在。使用該描述符進(jìn)行內(nèi)存訪問時(shí)會引起異常。
;
; (2) DPL:? 表示描述符特權(quán)級(Descriptor Privilege level),共2位。它規(guī)定了所描述段的特權(quán)級,用于特權(quán)檢查,以決定對該段能否訪問。
;
; (3) S:?? 說明描述符的類型。
;??????? 對于存儲段描述符而言,S=1,以區(qū)別與系統(tǒng)段描述符和門描述符(S=0)。
;
; (4) TYPE: 說明存儲段描述符所描述的存儲段的具體屬性。
;
;????????
;??? 數(shù)據(jù)段類型??? 類型值??????? 說明
;??????????? ----------------------------------
;??????????? 0??????? 只讀
;??????????? 1??????? 只讀、已訪問
;??????????? 2??????? 讀/寫
;??????????? 3??????? 讀/寫、已訪問
;??????????? 4??????? 只讀、向下擴(kuò)展
;??????????? 5??????? 只讀、向下擴(kuò)展、已訪問
;??????????? 6??????? 讀/寫、向下擴(kuò)展
;??????????? 7??????? 讀/寫、向下擴(kuò)展、已訪問
;
;???????
;??????????? 類型值??????? 說明
;??? 代碼段類型??? ----------------------------------
;??????????? 8??????? 只執(zhí)行
;??????????? 9??????? 只執(zhí)行、已訪問
;??????????? A??????? 執(zhí)行/讀
;??????????? B??????? 執(zhí)行/讀、已訪問
;??????????? C??????? 只執(zhí)行、一致碼段
;??????????? D??????? 只執(zhí)行、一致碼段、已訪問
;??????????? E??????? 執(zhí)行/讀、一致碼段
;??????????? F??????? 執(zhí)行/讀、一致碼段、已訪問
;
;???????
;??? 系統(tǒng)段類型??? 類型編碼??? 說明
;??????????? ----------------------------------
;??????????? 0??????? <未定義>
;??????????? 1??????? 可用286TSS
;??????????? 2??????? LDT
;??????????? 3??????? 忙的286TSS
;??????????? 4??????? 286調(diào)用門
;??????????? 5??????? 任務(wù)門
;??????????? 6??????? 286中斷門
;??????????? 7??????? 286陷阱門
;??????????? 8??????? 未定義
;??????????? 9??????? 可用386TSS
;??????????? A??????? <未定義>
;??????????? B??????? 忙的386TSS
;??????????? C??????? 386調(diào)用門
;??????????? D??????? <未定義>
;??????????? E??????? 386中斷門
;??????????? F??????? 386陷阱門
;
; (5) G:??? 段界限粒度(Granularity)位。
;??????? G=0 表示界限粒度為字節(jié);
;??????? G=1 表示界限粒度為4K 字節(jié)。
;?????????? 注意,界限粒度只對段界限有效,對段基地址無效,段基地址總是以字節(jié)為單位。
;
; (6) D:??? D位是一個(gè)很特殊的位,在描述可執(zhí)行段、向下擴(kuò)展數(shù)據(jù)段或由SS寄存器尋址的段(通常是堆棧段)的三種描述符中的意義各不相同。
;?????????? ⑴ 在描述可執(zhí)行段的描述符中,D位決定了指令使用的地址及操作數(shù)所默認(rèn)的大小。
;??????? ① D=1表示默認(rèn)情況下指令使用32位地址及32位或8位操作數(shù),這樣的代碼段也稱為32位代碼段;
;??????? ② D=0 表示默認(rèn)情況下,使用16位地址及16位或8位操作數(shù),這樣的代碼段也稱為16位代碼段,它與80286兼容。可以使用地址大小前綴和操作數(shù)大小前綴分別改變默認(rèn)的地址或操作數(shù)的大小。
;?????????? ⑵ 在向下擴(kuò)展數(shù)據(jù)段的描述符中,D位決定段的上部邊界。
;??????? ① D=1表示段的上部界限為4G;
;??????? ② D=0表示段的上部界限為64K,這是為了與80286兼容。
;?????????? ⑶ 在描述由SS寄存器尋址的段描述符中,D位決定隱式的堆棧訪問指令(如PUSH和POP指令)使用何種堆棧指針寄存器。
;??????? ① D=1表示使用32位堆棧指針寄存器ESP;
;??????? ② D=0表示使用16位堆棧指針寄存器SP,這與80286兼容。
;
; (7) AVL:? 軟件可利用位。80386對該位的使用未左規(guī)定,Intel公司也保證今后開發(fā)生產(chǎn)的處理器只要與80386兼容,就不會對該位的使用做任何定義或規(guī)定。
;
;----------------------------------------------------------------------------
; 在下列類型值命名中:
;?????? DA_? : Descriptor Attribute
;?????? D??? : 數(shù)據(jù)段
;?????? C??? : 代碼段
;?????? S??? : 系統(tǒng)段
;?????? R??? : 只讀
;?????? RW?? : 讀寫
;?????? A??? : 已訪問
;?????? 其它 : 可按照字面意思理解
;----------------------------------------------------------------------------
; 描述符類型
DA_32??????? EQU??? 4000h??? ; 32 位段
DA_DPL0??????? EQU????? 00h??? ; DPL = 0
DA_DPL1??????? EQU????? 20h??? ; DPL = 1
DA_DPL2??????? EQU????? 40h??? ; DPL = 2
DA_DPL3??????? EQU????? 60h??? ; DPL = 3
; 存儲段描述符類型
DA_DR??????? EQU??? 90h??? ; 存在的只讀數(shù)據(jù)段類型值
DA_DRW??????? EQU??? 92h??? ; 存在的可讀寫數(shù)據(jù)段屬性值
DA_DRWA??????? EQU??? 93h??? ; 存在的已訪問可讀寫數(shù)據(jù)段類型值
DA_C??????? EQU??? 98h??? ; 存在的只執(zhí)行代碼段屬性值
DA_CR??????? EQU??? 9Ah??? ; 存在的可執(zhí)行可讀代碼段屬性值
DA_CCO??????? EQU??? 9Ch??? ; 存在的只執(zhí)行一致代碼段屬性值
DA_CCOR??????? EQU??? 9Eh??? ; 存在的可執(zhí)行可讀一致代碼段屬性值
; 系統(tǒng)段描述符類型
DA_LDT??????? EQU????? 82h??? ; 局部描述符表段類型值
DA_TaskGate??? EQU????? 85h??? ; 任務(wù)門類型值
DA_386TSS??? EQU????? 89h??? ; 可用 386 任務(wù)狀態(tài)段類型值
DA_386CGate??? EQU????? 8Ch??? ; 386 調(diào)用門類型值
DA_386IGate??? EQU????? 8Eh??? ; 386 中斷門類型值
DA_386TGate??? EQU????? 8Fh??? ; 386 陷阱門類型值
; 選擇子圖示:
;???????? ┏━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┓
;???????? ┃ 15 ┃ 14 ┃ 13 ┃ 12 ┃ 11 ┃ 10 ┃ 9? ┃ 8? ┃ 7? ┃ 6? ┃ 5? ┃ 4? ┃ 3? ┃ 2? ┃ 1? ┃ 0? ┃
;???????? ┣━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━╋━━╋━━┻━━┫
;???????? ┃???????????????????????????????? 描述符索引???????????????????????????????? ┃ TI ┃?? RPL??? ┃
;???????? ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━┻━━━━━┛
;
; RPL(Requested Privilege Level): 請求特權(quán)級,用于特權(quán)檢查。
;
; TI(Table Indicator): 引用描述符表指示位
;??? TI=0 指示從全局描述符表GDT中讀取描述符;
;??? TI=1 指示從局部描述符表LDT中讀取描述符。
;
;----------------------------------------------------------------------------
; 選擇子類型值說明
; 其中:
;?????? SA_? : Selector Attribute
SA_RPL0??????? EQU??? 0??? ; ┓
SA_RPL1??????? EQU??? 1??? ; ┣ RPL
SA_RPL2??????? EQU??? 2??? ; ┃
SA_RPL3??????? EQU??? 3??? ; ┛
SA_TIG??????? EQU??? 0??? ; ┓TI
SA_TIL??????? EQU??? 4??? ; ┛
;----------------------------------------------------------------------------
; 宏 ------------------------------------------------------------------------------------------------------
;
; 描述符
; usage: Descriptor Base, Limit, Attr
;??????? Base:? dd
;??????? Limit: dd (low 20 bits available)
;??????? Attr:? dw (lower 4 bits of higher byte are always 0)
%macro Descriptor 3
??? dw??? %2 & 0FFFFh??????????????? ; 段界限1
??? dw??? %1 & 0FFFFh??????????????? ; 段基址1
??? db??? (%1 >> 16) & 0FFh??????????? ; 段基址2
??? dw??? ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh)??? ; 屬性1 + 段界限2 + 屬性2
??? db??? (%1 >> 24) & 0FFh??????????? ; 段基址3
%endmacro ; 共 8 字節(jié)
;
; 門
; usage: Gate Selector, Offset, DCount, Attr
;??????? Selector:? dw
;??????? Offset:??? dd
;??????? DCount:??? db
;??????? Attr:????? db
%macro Gate 4
??? dw??? (%2 & 0FFFFh)??????????????? ; 偏移1
??? dw??? %1??????????????????? ; 選擇子
??? dw??? (%3 & 1Fh) | ((%4 << 8) & 0FF00h)??? ; 屬性
??? dw??? ((%2 >> 16) & 0FFFFh)??????????? ; 偏移2
%endmacro ; 共 8 字節(jié)
; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2.Descriptor宏分析
?? 對照圖示1或圖示2可知宏Descriptor的轉(zhuǎn)換如下
; 描述符
; usage: Descriptor Base, Limit, Attr
;?????? Base:? dd???????????????????????????????????????????????????????? --32位段基址????????????????
;?????? Limit: dd (low 20 bits available)??????????????????????????? --20位段界限
;?????? Attr:? dw (lower 4 bits of higher byte are always 0) --12位屬性(16~19位為0)
%macro Descriptor 3????????????????????????????????????????????????? --Base,Limit,Attr
dw %2 & 0FFFFh ; 段界限1 = 取Limit的低16位(0~1字節(jié))
dw %1 & 0FFFFh ; 段基址1 = 取Base的低16位(2~3字節(jié))
db (%1 >> 16) & 0FFh ; 段基址2 = 取Base的高16位的低8位(4字節(jié))
dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) ; 屬性1 + 段界限2 + 屬性2
;屬性1 = 取Attr的低16位的高4位(6字節(jié)高4位)
;段界限2 = 取Limit的高16位的低4位(6字節(jié)低4位)
;屬性2 = 取Attr的低16位的低8位(5字節(jié))?
db (%1 >> 24) & 0FFh ; 段基址3 = 取Base的高8位(7字節(jié))
%endmacro ; 共 8 字節(jié)
3.Gate宏分析
; 門
; usage: Gate Selector, Offset, DCount, Attr
;??????? Selector:? dw???????????????????????????????????????????????? --16位選擇子
;??????? Offset:??? dd?????????????????????????????????????????????????? --32位偏移
;??????? DCount:??? db???????????????????????????????????????????????? --5位Param Count
;??????? Attr:????? db?????????????????????????????????????????????????? --8位屬性
%macro Gate 4
??? dw??? (%2 & 0FFFFh)??????????????? ; 偏移1 = 取Offset的低16位(0~1字節(jié))
??? dw??? %1??????????????????? ; 選擇子 = Selector的16位(2~3字節(jié))
??? dw??? (%3 & 1Fh) | ((%4 << 8) & 0FF00h);屬性 = DCount的低5位(4字節(jié)的低5位,高3位為0) 取Attr的8位并擴(kuò)展為16位的高8位(5字節(jié))
???? ;???
??? dw??? ((%2 >> 16) & 0FFFFh)??????????? ; 偏移2 = 取Offset的高16位(6~7字節(jié))
%endmacro ; 共 8 字節(jié)
?
總結(jié):剛開始看Descriptor的宏時(shí),確實(shí)被繞進(jìn)去了.作者將類型相同的位數(shù)進(jìn)行了整合。不過這樣更直觀了.其實(shí)對照pm.inc中的描述符和門的圖示結(jié)構(gòu)會更清晰
轉(zhuǎn)載于:https://www.cnblogs.com/Aoysme/archive/2011/01/05/1926746.html
總結(jié)
以上是生活随笔為你收集整理的《Orange’s 一个操作系统的实现》3.保护模式1----pm.inc分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 忘记了root密码怎么办?
- 下一篇: 网站“注册流程”如何“照顾用户”?