日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

「x86」- 特权级(Privilege Level)学习笔记 @20210215

發布時間:2023/12/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 「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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。