1. 程式人生 > >80386簡介--描述段描述符表

80386簡介--描述段描述符表

Intel 80386 微處理器的基本結構

Intel 80386 微處理器功能結構如圖,它是三部分組成:中央處理部件CPU、儲存管理部件MMU、匯流排介面部件BIU。


1.中央處理部件CPU:它由指令部件和執行部件組成。

(1)指令部件包括指令預取和指令譯碼兩部分,各有一個佇列,分別為指令預取佇列和指令譯碼佇列。指令預取用從儲存器取出來的指令程式碼臨時儲存在指令預取佇列中,然後見過指令譯碼的預譯碼後放入到已譯碼指令佇列中,以供指令執行部件呼叫。執行部件由8個32位的通用暫存器、1個32位的算術運算單、1個64位的桶形移位器和乘/除硬體。80386採用微程式控制方式,所有80386指令對應的微程式存放在其內部的控制儲存器中。指令譯碼器從指令預取佇列中取指令,將操作碼譯成與該指令操作碼相對應的控制ROM的入口地址,並存入譯碼指令佇列中,該佇列可容納3條已譯碼指令。

(2)執行部件執行從譯碼指令佇列中取出的已譯碼指令。它包含8個32位通用暫存器、32位的算術運算單元ALU、1個64位的桶形移位器和乘/除硬體。由於採用微程式技術,所以一條80386指令的執行過程實際是逐條執行該指令所對應的微程式中的微指令。出於縮短微指令寬度,即簡化控制儲存器電路的需要,微指令中廣泛使用欄位編譯法,因此在行微指令的過程中還需要譯碼,即控制單元要對微指令的欄位進行譯碼,產生一條指令操作的時序控制訊號(即微操作訊號)。80386的各個功能部件既能獨立工作,又能與其他部件配合工作,因此80386可採用比8086並行度更高的流水線操作方式,匯流排介面部件、指令譯碼部件、執行部件及儲存器管理部件四個部件並行工作,因此80386的指令流水線為4級。

2. 80386的暫存器結構

80386微處理器共有7類34個暫存器,通用暫存器組、段暫存器、指令指標和標誌暫存器、系統地址暫存器、控制暫存器、除錯暫存器、測試暫存器。


 (1)通用暫存器組:共有8個32位暫存器,EAX, EBX,ECX,EDX,ESP,EBP,ESI,EDI。它們由8086的16位暫存器擴充套件而來,它們的低16位與8086使用方法相同。

(2)段暫存器:共有6個16位的段暫存器CS、DS、SS、ES、FS、GS。與這6個段暫存器對應的有6個64位描述符暫存器,它是80X86處理器提供的一種附加的非程式設計的暫存器,用來裝64的段描述符,每當一個段選擇符被裝入段暫存器是,相應的段描述符就由記憶體裝入到對應的非程式設計的CPU暫存器。其中CS、DS、SS、ES與8086的段暫存器完全相同,在實地址方式下,使用方法也與8086相同;在虛地址保護方式下,這些暫存器中的值是“段選擇符”,需要查全域性描述符表(GDT)或者區域性描述符表(LDT)來獲得段的基地址,再加上偏移地址才能得到線性地址。 FS和GS是新加的附加資料段暫存器,可以由使用者將FS、GS定義為其他資料段。

(3)指令指標和標誌暫存器:指令指標暫存器EIP,由8086的IP暫存器擴充套件而來。標誌暫存器EFLAGS包含一組狀態標誌、一個控制標誌、一組系統標誌,圖四定義該暫存器中的標誌位。

1. 段選擇符(Segment Selector)

保護方式下,段選擇符指示著段描述符,在段描述符中,包含有定義段所用的全部資訊。其實,一個程式可以擁有比6 個段暫存器指示的段還要多的段。若某個程式使用的段多於6 個,當程式需要去訪問一個新段時,就使用傳送類指令MOV,去改變這些暫存器中的內容。由段選擇符識別段描述符,而段描述符在段描述符表內被逐一登記註冊。對應用程式來說,段選擇符作為指標變數的一個組成部分是可見的,但段選擇符的值通常是由連線編輯程式(Link Editor) 或連線裝配程式(Linking Loader) 指定或修改的,而不是由應用程式指定,更不能由應用程式對其實施修改操作。段選擇符是一個指向作業系統定義的段資訊的指標,其格式如圖所示。段選擇符是由16位資訊組成的,這16 位資訊又被進一步細分成3 個欄位:分別是13 位索引欄位、1 位的指示符欄位TI 以及2 位的請求特權級欄位RPL。現分述如下:

保護方式段選擇符格式

1) 段描述符指示符欄位TI

TI 欄位是位2,當TI=0時,該選擇符指向的段是系統的全域性地址空間(稱為全域性描述符表GDT);當TI=1 時,該選擇符指向的段是一個特定程式或任務的區域性地址空間(稱為區域性描述符表LDT)。全域性地址空間用來存放執行在系統上的所有任務使用的資料和程式碼段,如作業系統服務程式、通用庫和執行時間支援模組等。只要TI=0,便會指向這一空間,這也就是說,在系統上執行的所有任務共享同一個全域性地址空間。區域性地址空間用來存放一個任務獨自佔有的特定程式和資料,系統中每個任務都有其對應的區域性地址空間。

顧名思義,全域性描述符表是供系統中所有程式使用的;而區域性描述符表是供各自執行程式使用的。如果作業系統允許,不同的程式可以共享同一個區域性描述符表LDT。當然,系統也可以不使用區域性描述符表LDT,而所有程式都使用全域性描述符表GDT。

3) 索引欄位

索引欄位是由13 位組成,利用索引欄位可以從擁有213 個的段描述符表中選出一個段描述符來。微處理機是用8(8 是段描述符的位元組數)乘以索引值再加上描述符表的32 位基地址換算出來的。而描述符表的32 位基地址既可以是來自全域性描述符表暫存器GDTR,也可以是來自區域性描述符表暫存器LDTR。在這兩種暫存器中儲存著描述符表的起始線性地址,圖8.5 示出了怎樣用段選擇符中的TI 位說明使用的是全域性描述符表還是區域性描述符表。


圖 由指示符TI 位選擇的描述符

邏輯地址經分段部件轉換後所形成的地址被稱之為線性地址。若沒使用分頁機制,這時的線性地址就是實體地址;如果使用了分頁機制,二級地址轉換機制(即分頁機構)所生成地址就是實體地址。

2. 段描述符

段描述符,是由作業系統定義的、位於儲存器內的一種資料結構,段描述符內儲存著供處理機使用的有關段的屬性、大小規模、段在儲存器中的位置及控制和狀態資訊,段描述符在儲存器中的一個段和一個任務之間形成了一個鏈。它是一種特殊的段,不管是全域性地址空間還是區域性地址空間中的一個段,如果沒有描述符,則對該段任務來說便無效,且沒有訪問它的機制。一般說來,各段描述符是由各種編譯程式、各種連線程式、各種裝入程式或者作業系統產生的,而不是由各種應用程式生成的。

描述符分為段描述符和門描述符兩大類。段描述符又分成兩類:一般的段描述符(也稱儲存段描述符,包括程式碼段描述符和資料段描述符)和特殊的段描述符(又稱系統段描述符,包括區域性描述符表LDT 描述符和任務狀態段TSS描述符等)。門描述符包括呼叫門描述符、任務門描述符、中斷門描述符和陷阱門描述符4 種,當特權級之間和任務之間進行轉移控制時,使用這些門描述符。各種型別段使用的段描述符只能是其中一種。

3. 段描述符表

段描述符表簡稱描述符表,用來儲存保護方式下段描述符的一個陣列。80386/80486 CPU 共有3 種描述符表:全域性描述符表GDT、區域性描述符表LDT 和中斷描述符表IDT。描述符表由描述符順序排列組成,佔一定的記憶體,由系統地址暫存器(GDTR 、LDTR、IDTR) 指示其在物理儲存器中的位置和大小。

全域性描述符表GDT 是供所有任務使用的描述符表,在物理儲存器地址空間中定義全域性描述符表GDT。通常作業系統使用的有程式碼段描述符、資料段描述符、呼叫門描述符、各個任務的LDT 描述符、任務狀態段TSS 描述符、任務門描述符等。

區域性描述符表LDT 是每一項任務執行時都要使用的描述符表。在多工作業系統管理下,每個任務通常包含兩部分:與其他任務共用的部分及本任務獨有的部分。與其他任務共用部分的段描述符儲存在全域性描述符表GDT內;本任務獨有部分的段描述符儲存在本任務的區域性描述符表LDT 內。這樣,每個任務都有一個區域性描述符表LDT,而每個LDT 表又是一個段,它也就必須有一個對應的LDT 描述符。該LDT 描述符儲存在全域性描述符表中。區域性描述符表LDT 中所儲存的屬於本任務的段描述符通常有程式碼段描述符、資料段描述符、呼叫門描述符及任務門描述符等。

GDT 和LDT 段描述符表實際上是段描述符的一個長度不定的資料陣列,如圖8.5 所示。描述符表在長度上是可變的,最多容納213 個描述符,最少包含一個描述符。每個項有8 個位元組長,稱為一個段描述符。中斷描述符表IDT暫不介紹。

4. 描述符表暫存器

80386/486 微處理機用全域性描述符表暫存器GDTR 、區域性描述符表暫存器LDTR 和中斷描述符表暫存器IDTR,來查詢全域性描述符表GDT、區域性描述符表LDT 和中斷描述符表IDT, 如圖 所示。


圖 全域性描述符表暫存器GDTR 和區域性描述符表暫存器LDTR

1) 全域性描述符表暫存器GDTR

在全域性描述符表暫存器GDTR 內,儲存著全域性描述符表在實體地址空間內的32 位的基地址,同時全域性描述符表暫存器GDTR 中,還儲存表明這個表的規模大小為16 位的界限值,16 位段界限表明GDT 表最長為216KB(64KB) 。【例】 (GDTR)=0010 0000 0FFFH ,求GDT 在物理儲存器中的起始地址,結束地址,表的大小,表中可以存放多少個描述符?解:

GDT 的起始地址為0010 0000H

結束地址為:0010 0000H+0FFFH=0010 0FFFH

表的大小為:0FFFH+1=4096 位元組

表中可以存放:4096/8=512 個描述符

2) 區域性描述符表暫存器LDTR

區域性描述符表暫存器LDTR 包含一個16 位的選擇器(63 位~48 位)和不可見的快取記憶體器(47 位~0 位)。不可見的快取記憶體器內儲存著區域性描述符表LDT 的基地址、它的界限以及訪問控制權。對正在執行的任務而言,每一項任務執行時都要使用區域性描述符表LDT, 它們儲存在儲存器的一個獨立的段裡。但每個LDT 處於儲存器中的地址如圖8.9 所示,用區域性描述符表指令LLDT 對區域性描述符表暫存器LDTR 內的選擇符進行讀操作,用儲存在區域性描述符暫存器內的16 位的選擇符識別GDT,從GDT 中檢索出相應的LDT 描述符,處理器便將區域性描述符自動置入LDTR 的快取記憶體器中,將該描述符裝入高速緩衝暫存器就為當前任務建立了一個LDT。這樣80386/486 微處理器便可以根據LDTR 快取記憶體器的值來確定區域性描述符表的起始地址和段界限,而不必再訪問儲存器從GDT 中查出LDT 描述符,直接從LDTR 快取記憶體器來確定區域性描述符表的起始地址和段界限,節省了程式執行時間。


作業系統根據LDT 使用情況為LDTR 賦值

相關推薦

80386簡介--描述描述

Intel 80386 微處理器的基本結構 Intel 80386 微處理器功能結構如圖,它是三部分組成:中央處理部件CPU、儲存管理部件MMU、匯流排介面部件BIU。 1.中央處理部件CPU:它由指令部件和執行部件組成。 (1)指令部件包括指令預取和指令譯碼兩部分,

選擇描述描述

段描述符(8位元組)存放於 GDT/LDT 段選擇符(16位) + 偏移量(32位) = 邏輯地址 段暫存器僅僅存放段選擇符,段暫存器中的段選擇符指定非程式設計段暫存器中的段描述符。 關於描述符,描述符表,段選擇符的區別。 1、描述符      描述符是一個八位元組

選擇,描述,80x86的頁定址機制

段選擇符指示著段的描述符,在段描述符中包含有定義段所用的全部資訊,包括: (1)索引欄位:是由13位組成.利用索引欄位可以從擁有8192個段描述符的段描述符表中選出任何一個段描述符來。處理機用8(8是段描述符的欄位數)乘以索引值再加上描述符的基地址(來自全域性描述符暫存器,或

JNI字描述

ava 標示 編碼 border size 引用類型 face string short “([Ljava/lang/String;)V” 它是一種對函數返回值和參數的編碼。這種編碼叫做JNI字段描述符(JavaNative Interface FieldDescript

操作系統學習(五) 、代碼和數據描述

數據段 轉移 異常類 格式 需要 狀態 管理 更新 不能 一、代碼段和數據段描述符格式 段描述符通用格式如下所示: 代碼段和數據段描述符中各個位的含義如下所示: 二、代碼段和數據段描述符類型 當段描述符中S標誌位(描述符類型)被置位,則該描述符用於代碼段或數據段。

程序0的LDT0程式碼描述分析

LDT0的值為 ···· { \ {0,0}, \ /* ldt */ {0x9f,0xc0fa00}, \ {0x9f,0xc0f200}, \ }, ··· 其中第二項{0x9f,0xc0fa00}為程式碼段的描述符。

全域性描述 GDT

全域性描述符表GDT 全域性描述符表主要是為了讓計算機從真實模式到保護模式. 在真實模式下面訪問的地址都是真實的實體地址, 這樣的話每個程式都能直接的訪問實體地址, 並修改實體地址會很容易的造成系統的崩潰, 宕機. 所以為了讓使用者不能直接的訪問實體地址創造了虛擬地址,

保護模式-描述屬性

段暫存器位96位但是可見位數只有16位,剩下80位怎麼填充?80位裡每一位代表什麼意思? 上面為段描述符的結構 P(15): P=1 段描述符有效 P=0 段描述符無效 G(23): 我們先看看段描述符的結構 Struct Seg

全域性描述GDT和區域性描述LDT

段描述符        IA-32架構的處理器訪問記憶體都是採用“段基址:段內偏移地址”的形式,即使到了保護模式也不例外。其次,真實模式脆弱的安全性也是保護模式推出的重要原因。為了記憶體安全性,必須為記憶體段新增一些額外的安全屬性,如特權級、段界限、段型別等。描述記憶體段屬

【OS學習筆記】十四 保護模式二:描述

上一篇文章初步進入保護模式的學習。首先學習了全域性描述符表GDT。點選連結檢視上一篇文章:全域性描述符表 本篇文章繼續學習,GDT中存放的條目:描述符,確切的說是段描述符。學習段描述符的作用以及段描述符的格式。 1、段描述符的格式 真實模式和保護模式,在記憶體訪問上是由區別的

【OS學習筆記】十三 保護模式一:全域性描述(GDT)

上一篇文章,我們大致領略了現代處理器的結構和特點。點解連結檢視上一篇文章:現代處理器的結構和特點 本篇文章開始,學習保護模式下的的各種機制。什麼是保護模式呢? 一般來說,作業系統負責整個計算機軟硬體的的管理,它做任何事情都是可以的。但是使用者程式就應當有所限制,使用者程式它只能訪

轉發: 選擇描述暫存器

段暫存器(segement register) 段選擇符(segement selector) 段描述符(segement descriptor) 學習總結 1 段暫存器 段暫存器包括CS,SS,DS,ES,FS,GS。結構如下圖: 段暫存器包括可見部分和不可見部分。可

GDT全域性描述

GDT全域性描述符表 什麼是GDT全域性描述符表 GDT全稱為Global Descriptor Table,全域性描述符表。 保護模式的定址方式不在使用暫存器分段的方式直接定址方式了。而採用的是使用GDT(全域性分段描述表)來定址。從而使用更多的記憶體地址。 建立GDT全域性描述符表使用到一個48位

GDT全局描述

位操作 不能 glob 全局 建立 數據加載 ... 內存地址 信息 GDT全局描述符表 什麽是GDT全局描述符表 GDT全稱為Global Descriptor Table,全局描述符表。 保護模式的尋址方式不在使用寄存器分段的方式直接尋址方式了。而采用的是使用GDT(全

驅動開發(10)直接I/O和記憶體描述

在上篇博文中,我們實現了在驅動程式中處理裝置收到讀寫I/O請求,這個請求我們是使用緩衝I/O處理的。 在上一篇中,我已經詳細解釋了使用緩衝I/O的原因,在這裡簡單重複一下,如果要看詳細解釋請看上一篇博文。 當我們呼叫ReadFile(Ex)和WriteFile(Ex)讀寫

x86架構下的系統描述格式

        如果還記得前面的GDT全域性描述符表的話,那麼一定不會忘記段描述符中有個s欄位,若為0,則表示這個描述符是系統段,若為1,則是普通的段描述符;普通的段為ds,es,ss,cs等等,系統的段則有GDT,呼叫門,TSS,LDT等等。現在來看看幾個系統段描述符格式

檔案描述,開啟檔案,索引節點

 下圖是一個例項,其中描述符1和4通過不同的開啟檔案表表項來引用兩個不同的檔案,這是一種典型的情況,沒有檔案共享,並且每個描述符對應一個不同的檔案:       多個描述符也可以通過不同的檔案表表項來引用同一個檔案。例如,如果以同一個檔名呼叫open函式2次,就會發生這種情況。關鍵思想是每個檔案描

全域性描述解析

概念 全域性描述符表GDT是為了實現32位模式的分段,跟16位模式的分段是一個概念。只是實現方式不一樣。 在32位中,描述一個段需要以下資訊: 段的大小(至少1M,即20位) 段的起始地址(4G, 即32位) 段的屬性(禁止寫入,禁止執行, 系統專用等,

JavaScript---Object.defineProperty()與兩種屬性描述簡介->資料\存取描述

不得不說MDN網站真心好用, 裡面例子真心不錯. 轉載僅出於學習目的. Object.defineProperty( ) 方法會直接在一個物件上定義一個新屬性,或者修改一個物件的現有屬性, 並返回這個物件。 語法: Object.de

Bran的核心開發教程(bkerndev)-06 全域性描述(GDT)

全域性描述符表(GDT)   在386平臺各種保護措施中最重要的就是全域性描述符表(GDT)。GDT為記憶體的某些部分定義了基本的訪問許可權。我們可以使用GDT中的一個索引來生成段衝突異常, 讓核心終止執行異常的程序。現代作業系統大多使用"分頁"的記憶體模式來實現該功能, 它更具通用性和靈活性。GDT還定義了