[计算机硬件及网络]Intel 80x86 保护模式架构.doc
《[计算机硬件及网络]Intel 80x86 保护模式架构.doc》由会员分享,可在线阅读,更多相关《[计算机硬件及网络]Intel 80x86 保护模式架构.doc(45页珍藏版)》请在三一办公上搜索。
1、Intel 80x86 保護模式架構緒論Intel Architecture 架構概觀Intel Architecture 又稱 x86 架構,因為它的第一代處理器的代號是 8086,而其後繼產品依序以 8088、80186、80188、80286為代號,均為 80x86 的形式;而在 80286 之後,Intel 改以 i386、i486 來命名,因此才被稱為 x86 架構。在 i486 處理器之後,Intel 就不再以 x86 的形式命名,所以在這裡以較正式的 Intel Architecture 來稱呼這個架構(簡稱 IA 架構)。 Intel Architecture 系列的處理器中,
2、最早的 8086 是一 16 bit 的處理器,具有 16 bit 的暫存器和 data bus,並具有 20 bit 的定址能力,能定址最多達 1MB 的記憶體,在當時算是相當大的數目。然而,20 bit 的位址和 16 bit 的暫存器無法相符,因此 Intel 設計了一種 segment:offset 的定址方式,利用兩個 16 bit 暫存器來表示一個 20 bit 的位址。 到了 80286 的時代,1MB 的定址能力已經不敷使用,因此 Intel 為它設計了一個新的保護模式(Protected Mode),並將原先 8086 所使用的方式稱為實際模式(Real Mode)。8028
3、6 具有 24 bit 的定址能力,可以定址 16MB 的記憶體,但是只有在保護模式下才能發揮。在實際模式中,為了維持和 8086 的相容性(這點是 Intel 非常堅持的),還是只能使用 1MB 的記憶體。80286 的保護模式已經有了多工作業的能力,並且可以保護各個節區的資料和程式不被其它程式干擾。IBM 的 OS/2 1.x 和 Microsoft 的 Windows 3.x 都有支援這個模式。 在 i386 出現時,情形有很大的變化。i386 是一個 32 bit 的處理器,並具有 32 bit 的定址能力,可以定址達 4GB 的記憶體。它同時也改進了 80286 不完整的的保護模式,
4、提供了很多新的功能,如虛擬記憶體等等。在這篇文章中所要說明的保護模式架構,就是指 i386 的保護模式。 IA-32 的操作模式在 i386 以後的 Intel Architecture 相容處理器(統稱 IA-32 架構),具有四種操作模式: 實際模式(Real Mode):在這個模式下,處理器就好像是一個超快速的 8086 一般。 (32 bit 的)保護模式(Protected Mode):在這個模式下,處理器具有多工、分節保護、分頁等等的能力。 虛擬 8086 模式(Virtual-8086 Mode):這個模式是在一般的保護模式下,模擬一個 8086 的執行環境,可以同時執行多個 8
5、086 程式。 系統管理模式(System Management Mode,SMM):這個模式會使處理器切換到一個獨立的定址空間中執行,通常在電源管理之類的系統工作才會使用這個模式。 而在保護模式中,有四個重要的部分:記憶體管理、保護機制、中斷例外處理、和多工處理。在本文中,會分別針對這四點做詳細的說明。而在 P6 家族(包括 Pentium Pro、Pentium II 等處理器)中所提供的新功能(如延伸定址模式,Extended Addressing)則不在本文範圍之中。 系統暫存器在處理器中有一些暫存器,是用來控制系統的一些行為的,這些暫存器通常只有作業系統會使用。這些暫存器中,和保護模
6、式有關的,有: 在 EFLAGS 中(32 bit 的旗標暫存器)的一些系統旗標和 IOPL 欄位。在保護模式中,只有 CPL 小於或等於 IOPL 的程式才存取 I/O 位址空間,和進行一些其它的操作。 控制暫存器(Control Registers),包括 CR0、CR2、CR3、CR4(CR1 保留)。這些暫存器包括一些和保護模式關係密切的內容(例如,是否進入保護模式、是否開啟分頁功能等等)。 GDTR、LDTR、和 IDTR。這三個暫存器存放三個系統的 descriptor table 的基底位址和邊界(大小)。 工作暫存器(Task Register)存放目前工作(task)的 TS
7、S 的基底位址和大小。 在後面的章節中,會分別對這些暫存器做較詳細的說明。 記憶體管理簡介定址方式在保護模式中,有三種定址方式:邏輯位址(Logical Address)、線性位址(Linear Address)、和實體位址(Physical Address)。對大部分的應用程式而言,幾乎只會用到邏輯位址。線性位址和實體位址在大部分的情形中,只有作業系統會使用。 所謂的實體位址,就是指系統的記憶體的真正位址,它的範圍由 00000000H 到 FFFFFFFFH,共有 4GB。大部分情形中,系統的 RAM 都是由 00000000H 開始定址(即在最底端),而 ROM 則由 FFFFFFFFH
8、 開始定址(即在最頂端)。這是因為在 RESET 之後,處理器會從定址空間的頂端開始執行,所以把 ROM 定址在頂端才能讓處理器在 RESET 後執行到開機用的程式(如開機自我測試之類的程式)。 在沒有使用分頁(Paging)功能的時候,線性位址是直接對映到實體位址的,也就是說,線性位址就等同於實體位址。不過,在開啟分頁分能之後,一個線性位址可能沒有相對映的實體位址(因為它所對映的記憶體可能被 swap 到硬碟裡了)。所謂的分頁功能,是指把定址空間分割成許多頁,而實際的記憶體可能無法容納這麼多頁,因此有些頁若暫時沒有用到,就可以暫時存放到硬碟(或其它儲存媒體)中,等到需要的時候再取出來。這個功
9、能可以讓系統使用比實際的 RAM 空間更大的記憶體。因此,在這種情形下,一個線性位址所在的頁可能還在硬碟中,因此,要存取這個位址,就要先把 swap 到硬碟中的資料取出,放到實體記憶體中的某個位置中(這時,可能有些頁就得讓開位置,被 swap 到硬碟中了)。 而邏輯位址則和實際模式類似,仍然是 segment:offset 的形式,只不過現在 offset 的大小改成 32 bit 而已,而 segment 仍然是 16 bit。不過,和實際模式不同的是,segment 的地位和過去不同;在保護模式中,segment 的位置不再是固定的,而是可以自由決定的。Segment 暫存器(稱為 Seg
10、ment Selector)則是用來選擇想要使用的 segment。同時,在保護模式中,segment 也可以有大小限制,不像在實際模式中,一個 segment 一定是 64KB(雖然 segment 的實際大小可以比 64KB 小,但是處理器並不會檢查存取動作是否超出了 segment 的範圍)。在保護模式中,每一個 segment 都有一個 segment descriptor,描述這個 segment 的位置、大小、型態、存取權限等等資料。Segment 的位置是以基底位址來表示,基底位址是一個線性位址。要存取 segment 中的某個位址,需要指定一個 offset 位址,而實際的線性
11、位址則是將 segment 的基底位址加上 offset 就可以得到。下圖顯示出這個記憶體架構的運作方式: 上圖中,顯示出 segment 的 segment descriptor 是存放在 Global Descriptor Table(GDT)或 Local Descriptor Table(LDT)中。GDT 和 LDT 都是由 segment descriptor 所組成的陣列。Segment selector 則可以視為這個陣列的 index。GDT 的基底位址存放在 GDTR 中(GDTR 是一個暫存器),而 LDT 的基底位址則放在 LDTR 中(LDTR 也是一個暫存器)。 分
12、段架構可以有效地解決多工環境中,程式和資料的重定位(Reallocation)問題。利用分段架構,為程式和資料分別指定一個 segment,程式和資料都可以從 00000000H 開始取用,而不受程式和資料在記憶體中的位址影響。同時,分段架構也可以避免錯誤的程式意外地存取到不該存取的位址。 分頁架構當分頁功能開啟時,線性記憶體就不是直接對映到實體記憶體上了。線性記憶空間會分割成許多固定大小的頁(Pages),通常是 4KB。在以線性位址存取記憶體時,處理器會找出對映的頁,並把線性位址轉換成相對的實體位址。如果該線性位址所對映的頁現在並不在實體記憶體中,則處理器會發出一個 page-fault
13、的例外(Exception)。作業系統必須提供一個例外的 handler 來處理這個例外,來取出所需要的頁(例如,作業系統可能會把某一個不需要的頁寫到 swap file 中,再從 swap file 中讀入現在需要的頁)。在處理完這個例外之後,程式就可以從發生例外的地方開始,繼續執行下去。 分頁的大小有兩種:4KB 和 4MB。在 4KB 的模式中,線性位址被分成三個部分:目錄索引(Directory)、表索引(Page Table)、和偏移量(Offset)。如下圖所示: 所有分頁目錄和分頁表中所記載的位址,均為實體位址。在 CR3 中所存放的分頁目錄的基底位址,也是實體位址。分頁目錄的基
14、底位址必須是 4KB 的倍數。 另一個模式是 4MB 分頁模式,即一頁的大小是 4MB。4MB 分頁模式和 4KB 分頁模式很類似,但是在 4MB 分頁模式中,只有分頁目錄,沒有分頁表;即分頁目錄中的 Directory Entry 直接指向分頁的基底位址,而在線性位址中的表索引則和偏移量合併成 22 bits(4MB)的偏移量。如下圖所示: 4MB 分頁模式和 4KB 分頁模式可以共用。例如,在作業系統中,可能會想把整個核心(Kernel)都放在同一頁中,以減少 swap 所產生的額外負擔,而在其它的地方則使用 4KB 的分頁空間。 記憶體管理分段架構Segment Selectors 和分
15、段暫存器在保護模式中,分段暫存器是存放 segment selector 的。共有六個分段暫存器:CS、DS、ES、FS、GS、和 SS,它們的用途和在實際模式中類似(例如,CS 指向程式碼的 segment,而 SS 指向堆疊的 segment)。Segment selector 由三個欄位組成:索引、Table Indicator(TI)、和 Requested Privilege Level(RPL)。索引是 segment 在 GDT(或 LDT)中的位置,而 TI 表示所要使用的 descriptor table(GDT 或 LDT),而 RPL 則是該 selector 的特權等級
16、。如下所示: 索引共有 13 bits,因此在一個 descriptor table 中,最多可以有 8192 個 segment。處理器把索引的值乘上 8(一個 segment descriptor 的大小),再加上 GDTR(或 LDTR,根據 TI 的設定)的位址,就得到 segment descriptor 的位址(GDTR 和 LDTR 分別是 GDT 和 LDT 的基底位址)。當 TI 為 0 時,會取用 GDT 中的 segment descriptor,而 TI 為 1 時,則會取用 LDT 中的 segment descriptor。RPL 有 2 bits,範圍可以由 0
17、至 3(0 的特權等級最高,而 3 最低)。關於 RPL 的一些較詳細的內容,會在保護機制一章中說明。 處理器不會使用 GDT 的第 0 個位置(稱為 null segment)。因此,可以把所有不會用到的分段暫存器設成 null segment(把索引和 TI 均設為 0),以表示目前沒有使用這個分段暫存器。如果試圖要存取 null segment,處理器會發出例外。此外,若把 CS 或 SS 設成 null segment,處理器也會發出 general-protection 例外。 在處理器內部,實際上分段暫存器除了 segment selector 的部份外(這部份稱為 Visible
18、 Part),還有一個 Hidden Part。這是為了避免處理器在存取邏輯記憶體時,還要到記憶體中讀取 descriptor table 所造成的額外負擔。當一個分段暫存器被指定一個 segment selector 時,處理器會自動讀入 descriptor table 中的一些資料,並把這些資料放到分段暫存器中。如此一來,處理器就不需要每次都去讀取 descriptor table 中的資料了。不過,如果系統上有多個處理器共用同一個 descriptor table 時,則作業系統要負責在 descriptor table 改變時,重新指定分段暫存器,否則暫存器中的資訊可能會是舊的,而導
19、致錯誤的結果。 Segment DescriptorSegement Descriptor 存放在 GDT 或 LDT 中,是描述一個 segment 的資料結構。每一個 segment descriptor 都是 8 bytes。下面是一個 segment descriptor 的格式: 在 Segment Descriptor 中,基底位址(共 32 bits)被分為三個部份,而分段邊界(共 20 bits)則被分為兩個部份。分段邊界表示一個 segment 的大小,但是因為它只有 20 bits,所以用 G 來表示它的單位。當 G 為 0 時,大小是以 byte 為單位,即 segmen
20、t 最大可以到 1MB。當 G 為 1 時,則 segment 的大小是以 4KB 為單位,即 segment 的大小最小是 4KB,最大是 4GB。在以 4KB 為單位時,位址最右邊的 12 bits 在測試 segment 邊界時會被忽略(例如,即使把分段邊界設為 0,在位址 0 到 4095 仍然是合法的)。如果程式試圖存取在 segment 邊界之外的資料,則會產生例外。這樣可以保護其它的 segment 不會被不正確的程式所影響。 P 是用來指示 segment 是否存在記憶體中。如果 P = 0,則表示 segment 目前不在記憶中;反之,若 P = 1,則表示 segment
21、在記憶體中。當把一個 P = 0 的 segment descriptor 載入到分段暫存器中的時候,處理器會發出一個 segment-not-present 的例外。記憶體管理程式可以利用這個特性,來進行虛擬記憶體管理。這提供了一個不使用分頁功能,也可以進行虛擬記憶體管理的方式。當 P = 0 時,segment descriptor 中的低字組(在上面標示為 0 的字組)可供系統程式自由使用,而高字組(標示為 4 的字組)的 bit 0 bit 7 和 bit 16 bit 31 也都可以供系統程式使用。作業系統可以利用這些空間來存放相關的資訊,例如分段在 swap file 中的位置等等
22、。 Segment descriptor 的高字組中的第 20 個 bit 是可供系統程式自由使用的 bit,作業系統可以在這裡存放相關的資訊。第 21 個 bit 則保留,一定要設為 0。 D/B 在不同的狀況下,有不同的意義。當 segment 是一個可執行的程式碼的 segment,則這個旗標叫 D。D = 0 表示在這個 segment 中的程式內定使用 16-bit 的位址,而 D = 1 表示在這個 segment 中的程式內定使用 32-bit 的位址。若 segment 是一個堆疊或是資料的 segment ,則這個旗標叫 B。B = 0 表示這是一個 16-bit 的 seg
23、ment,最大值為 FFFFH,而 B = 1 則表示這是一個 32-bit 的 segment,最大值為 FFFFFFFFH。 分段的型態在 segment descriptor 中的 S 旗標,在 S = 0 時表示 segment 是一個系統 segment(如 LDT),而 S = 1 時則表示這是一個一般的程式資料 segment。在 S = 1 時,型態的最左邊的 bit(即第 11 個 bit)為 0 表示這是一個資料 segment,否則表示這是一個程式 segment。 資料 segment 存放程式所用的資料,而堆疊 segment 也算是一種資料 segment。資料 s
24、egment 的型態位元,由右至左分別稱為 A、W、和 E(分別是第 8、9、10 bit)。A 是 accessed,而 W 是 Write-enable,E 是 expand-direction。A 位元若設為 0,則在對這個 segment 進行任何存取動作之後,處理器會把 A 設為 1。這個功能可以用在虛擬記憶體管理中,判斷一個 segment 是否需要更新;也可以用來做 debug 的用途。W 位元若設為 1,才可以把資料寫入 segment 中。所以,不希望被意外變更的 segment,可以把它的 W 設為 0。不過,若把一個唯讀(W = 0)的 segment 載入 SS 中,會
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机硬件及网络 计算机硬件及网络Intel 80x86 保护模式架构 计算机硬件 网络 Intel 80 x86 保护 模式 架构

链接地址:https://www.31ppt.com/p-4561322.html