硬體的分節功能
從80286開始Intel在微處理器就用來種方式進行位址的轉譯
1.真實模式(Real Mode) 2.保護模式(Protected Mode)
· 真實模式
· 主要為了讓處理器能與舊型號相容,以及讓作業系統可以起動(Bootstrap)
· 保護模式
· 在這種模式下,處理器支持所有的指令和所有的體系結構特性
· 提供最高的性能和兼容性
節區選取器&分節暫存器
邏輯位址分成兩個部分組成:
1.節區識別碼(16位元)-節區選取器(Segment Selector) 2.節區內相對位址的偏移量(32位元)
為了讓節區選取器可以被快速取出,所以處理器提供了分節暫存器(Segmentation Register),唯一功能就是保存節區選取器;這些暫存器分別叫 cs , ss , ds , es , fs , gs
其中三個暫存器有特定用途:
· cs 程式節區暫存區(Code Segment Register) 指向含有程式指令的一個節區
· ss 堆疊節區暫存區(Stack Segment Register) 指向含有當前程式堆疊的一個節區
· ds 資料節區暫存器(Data Segment Register) 指向含有全域或靜態資料的一個暫存器
其他三個分節暫存器屬於一般用途,可以參用到任何資料節區。
cs暫存器有另一個重要功能:
它包含一個2位元的欄位,可用來指定CPU當前的特權等級(Current Privilege Level 簡稱 CPL) :0 代表最高特權等級 3 代表最低的特權等級 。Linux 只會用 0 3 這兩個等級 分別叫 核心模式(Kernel Mode)和用戶模式(User Mode)
節區敘述器(Segment Descriptor)
每一個節區可有一個8位元組的節區敘述器來表示。
節區敘述器主要儲存兩種東西:
1. 全域敘述器表格(Global Descriptor Table 簡稱 GDT )
2. 區域敘述器表格(Local Descriptor Table 簡稱 LDT )
節區有分好幾種,因此節區敘述器也有好幾種,下面是Linux常用的幾種節區敘述器
· 程式節區紀錄器(Code Segment Descriptor)
· 表示此節區敘述器所參用的是程式節區
· 他可能位於GDT 或是 LDT 之內
· 資料節區敘述器(Data Segment Descriptor)
· 表示此節區敘述器所參用的是資料節區
· 他可能位於GDT或是LDT之內
· 堆疊節區的實作就是透過一般的資料節區
· 任務狀態節區敘述器(Task State Segment Descriptor 簡稱TSSD )
· 表示此節區敘述器所參用的是任務狀態節區(TSS)
· 這個節區是用來儲存處理器之暫存器的內容
· 他可能位於GDT之中
· 區域敘述器表格敘述器(Local Descriptor Table Descriptor簡稱LDTD )
· 表示此節區敘述器所參用的是含有LDT的節區,而且只能出現在GDT中
分節單元(Segmentation Unit)
分節單元會進行下來操作
1. 檢視選取器的TI欄位,以判定節區敘述器中儲存的是哪種敘述器表格。這個欄位會指出敘述器位於GDT或自有的LDT(分節單元會從gdtr或是ldtr取得GDT或是LDT的基底線性位址)。
2. 從節區選取器的 index 欄位來計算節區敘述器的位址。index欄位的值會被乘以8(節區選取器的大小),而其結果會與gdtr或是ldtr 暫存器的內容相加。
3. 把邏輯位址的偏移量和節區敘述器的BASE欄位相加,藉此獲得線性位址。
留言列表