「x86」- 特权级(Privilege Level)学习笔记 @20210215
該筆記是《x86 匯編語言:從實模式到保護模式》的「第 14 章 任務和特權級保護」的學習筆記。
程序,Program,是記錄在載體上的指令與數據。
任務,Task,是正在執行的程序副本。
LDT - Local Descriptor Table
為了實現任務的隔離,處理器建議每個任務都應該具有自己的描述符表,局部描述符表(LDT,Local Descriptor Table),并將屬于任務自己的段保存到 LDT 中。
與 GDT 不同,LDT 的零號槽位可是可用的。
LDTR - LDT Register
LDT 具有多個,為了追蹤,處理器使用 LDTR(LDT Register)來追蹤和訪問 LDT,LDTR 的結構與 GDTR 相同,包含 32-bit 線性基地址 以及 16-bit 段界限 字段。
正在執行的任務為當前任務(Current Task),LDTR 只有一個,它指向當前正在運行的任務。任務發生切換時,會更新 LDTR 的內容,以指向新任務。
TSS - Task Status Segment
當任務發生切換時,需要保存當前任務的狀態(比如各種寄存器),否則下次切換回該任務時無法繼續執行。保存任務狀態的段,本質上還是內存段,被成為任務狀態段(TSS,Task Status Segment)。
該段格式固定,最小 104 字節,處理器固件能夠識別 TSS 的每個元素。在任務切換時,處理器會讀取其中的信息。
TR - Task Register
任務寄存器,TR,Task Register,用于指向當前任務的 TSS。當任務發生切換時,TR 也會指向新任務的 TSS。
切換過程(簡述):處理器將當前任務狀態保存到 TR 執行的 TSS 中,然后使 TR 指向新任務的 TSS,并從新的 TSS 中恢復任務狀態
特權級別,Privilege Level
特權級別,Privilege Level,是存在于 Descriptor 及 Segment Selector 中一個數值,當這些 Descriptor 或 Segment Selector 要進行某些操作,或者被別的對象訪問時,該數值用于控制它們能夠進行的操作或者限制它們的可訪問性。
Intel Processor 具有 4 個特特權級別(0-3)
描述符特權級(DPL,Descriptor Privilege Level)
每個 Descriptor 都具有描述符特權級(DPL,Descriptor Privilege Level)字段。Descriptor 總是指向它所“描述”的目標對象,代表帶對象,因此該字段(DPL)實際上是目標對象的特權級。
當前特權級(CPL,Current Privilege Level)
當處理器正在某個代碼段中取指令執行時,該代碼段的特權級叫做當前特權級(CPL,Current Privilege Level),這就是在段寄存器 CS 中 Segment Selector 的最低兩位。
特權指令(Privileged Instructions)
某些指令只有 CPL == 0 時才能執行,這些指令稱之為特權指令,比如 hlt 或者 對控制寄存器 CR0 的寫操作。
輸出特權級(I/O Privilege Level)
除此之外,還有輸入輸出特權級(I/O Privilege Level),使用 EFLAGS 的 IOPL(13-14)位進行控制。
控制轉移的方法
代碼段的特權級檢查是很嚴格的,一般來說,控制轉移只允許發生在兩個特權級相同的代碼段間。比如 CPL == 2 可以轉移到 DPL == 2 的代碼段,但是不能轉移到 DPL == 0/1/3 的代碼段。
但是為了使特權級低的程序調用特權級高的操作系統例程,處理器提供相應的解決方法:
方法一、將高特權級的代碼段定義為依從的
對于高特權級的代碼段,將其 TYPE 字段的 C 位設置為 1(即依從的代碼段),這樣特權級低的程序則可以調用進入高特權級的代碼段
但是,特權級的檢查依舊非常嚴格:必須保證 CPL 低于 DPL,即數值上 CPL >= DPL (值越大,特權級越低,所以是 >= 符號,沒有寫錯)。比如說 DPL == 1 則只有 CPL == 1/2/3 可以調用。
另外,特權級不會發生變化,即:對于定義為依從的高特權級的代碼段,當從特權級低的程序調用進入后,當前特權級依舊是特權級低的程序的特權級,而不使用高特權級代碼段的特權級。比如從 CPL == 3 進入 DPL == 1 代碼段,依舊 CPL == 3 而不是 CPL == 1,這也是被稱為“依從”的原因。
方法二、使用調用門(Call Gate)
# 門,Gate,也是種描述符,有調用門,陷阱門/中斷門,任務們。這里學習的是調用門(Call Gate)
調用門也是 64-bit 的 Descriptor,在 Call Gate Descriptor 中,描述了目標例程的(1)代碼段選擇子(2)以及段內偏移。
調用 Call Gate 指向的函數,只需要使用調用門選擇子作為 CALL FAR / JMP FAR 的操作數。
使用 JMP FAR 不改變特權級,依舊使用 CPL 運行。使用 CALL FAR 將改變特權級(CPL = DPL)。另外,除了從高特權級例程中返回,不允許從高特權級例程進入低特權級歷程。
相關文章
「Intel 80x86」- 寄存器(學習筆記)
參考文獻
閱讀《x86 匯編語言:從實模式到保護模式》的「第 14 章 任務和特權級保護」
總結
以上是生活随笔為你收集整理的「x86」- 特权级(Privilege Level)学习笔记 @20210215的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 诛仙手游 法宝属性道法性价比
- 下一篇: 方程检验格式图片_解方程并检验(图片)