x86保護模式

來源:本網整理

x86匯編語言-從實模式到保護模式 不錯 你還可以下個《保護模式下80386編程》!想買就買《x86匯編語言-從實模式到保護模式》和《X86/X64結構探索及編程》前者 網上只有前13章 后者只能買www.13333515.buzz防采集請勿采集本網。

處理器架構實際上是不斷擴展的,新處理器必須延續舊的設計思路,并保持兼容性和一致性;同時還會有所擴充和增強。

不如看30天自制操作系統,簡單,也有實模式跳轉到保護模式的完整代碼

盡管8086是16位的處理器,但它也是32位架構內的一部分。原因在于,32為處理器架構是從8086那里發展來的,是基于8086的,具有延續性和兼容性。

寄存器的擴展

初步鑒定你是WIN10吧,親。64位系統是模擬運行32位程序,效率會稍差,而且你文件是12年的,當時條件下對現在的系統支持度肯定是有兼容問題的。解決方法一:兼容模式運行 解決方法二:百度asm

32位處理器在16位處理器的從基礎上,擴展了這8個通用寄存器(AX,BX,CX,DX,SI,DI,BP,SP)的長度,使之達到32位。

實模式也就是8086匯編,限制在 1M 的內存范圍內編程。保護模式則進行了擴展,可以在 16M 的內存范圍內編程,相對就復雜些。但不管是實模式,還是保護模式,都是已過時的技術。后來的技術有386

32位通用寄存器的高16位是不可獨立使用的,但低16位保持同16位處理器兼容性。因此,在任何時候他們都可以照往常一樣使用。

我剛下載到了掃描版。68MB。要不要百度盤share給你。鏈接:/s/1pJFUbwR密碼:fn86

但是32位處理器并不是16位處理器簡單的增強。事實上32位處理器有自己的32位工作模式,而我學習的32模式是32位保護模式。在這種模式下,處理器可以使用它全部的32跟地址線,能夠訪問4GB內存。

無論實模式還是保護模式,根本的問題還是程序如何在其中運行。因此我們在學習保護模式時應該時刻圍繞這個問題來思考。和實模式下一樣,保護模式下程序運行的實質仍是“CPU執行指令, 操作相關數據”,因此

在32位模式下,為了生成32位物理地址,處理器需要使用32位的指令指針寄存器。為此,32位處理器擴展了IP,使之達到32位,工作在32位模式下時使用EIP,但是當工作在16位模式下仍使用IP。

對于32位模式下因為IA-32架構的處理器是基于分段模型,可是32位模式下,對內存的訪問從理論上不需要分段,因為它可以自由訪問任何一個內存位置。所以引入了平坦模型,即只分一個段,段的基址是0x00000000,段的長度是4GB,在這種情況下視為不分段。

在32位模式下,處理器要求在加在程序時,先定義該程序所擁有的段,然后允許使用這些段。定義段時,除了基地址外,還附加了段界限,特權級別,類型等屬性。當程序訪問一個段時,處理器將用固件實施各種檢查工作,以防止對內存的違規訪問。

在32位模式下,傳統的段寄存器,如CS,SS,DS,ES,保存的不再是16位段基地址,而是段的選擇子(實模式下是段寄存器,在保護模式下就是段選擇子,因為在保護模式下他們存儲的不再是段地址而是段描述符在描述符表中的索引號),即用于選擇要訪問的段,除了段選擇子外,每個段寄存器還包括一個不可見部分,稱為描述符高速緩沖器,里面有段的基地址和各種訪問屬性。

在保護模式下訪問一個段的時候,傳送到段選擇器的是段選擇子。他由三個部分組成,第一部分是索引號,用來在描述符表種選擇一個段描述符。T1是描述符表指示器,T1=0時,描述符在GDT中,T1=1時,描述符在LDT中。RPL是請求特權級,表示給出當前選擇子的那個程序的特權級

這里寫圖片描述

線性地址

我們傳統上講的,段地址個偏移地址稱為邏輯地址,偏移地址叫做有效地址,在指令中給出有效地址的方式叫做尋址方式。

然而段的管理是由處理器的段部件負責進行的,段部件將段地址和偏移地址相加,得到訪問內存的地址。一般來說,段部件產生的地址就是物理地址。

但是為了解決內存空間碎片化(內存每次分配大小不定,時間長后會產生過多過小的內存空間塊),IA-32處理器支持分頁功能,分頁功能將物理內存空間劃分成邏輯上的頁。通過使用頁,可以簡化內存管理。

當頁功能開啟時,段部件產生的地址就不再是物理地址了,而是線性地址,線性地址還要經過頁部件轉換后,才是物理地址。

線性地址的概念用來描述任務的地址空間。IA-32處理器上的每個任務擁有4GB的虛擬內存空間,這是一段長4GB的平坦空間,就像一段平直的線段。相應的,由段部件產生的地址,就對應著線性地址空間上的每一個點,這就是線性地址。

全劇描述符表

在保護模式下,對內存的訪問仍能使用段地址和偏移地址,但是,在每個段能夠訪問之前,必須先進行登記。當你訪問的偏移量超出段的界限時,處理器就會阻止這種訪問,并產生一個叫做內部異常的中斷。

斷描述符,用八個字節來描述一個段有關的信息。為了存放這些描述符,需要在內存中開辟一段空間,在這段空間里,所有的描述符都是挨在一起,集中存放的,這就形成了一個描述符表。

最主要的描述符表是全局描述符表(GDT),在進入保護模式前,必須要定義全局描述符表。

這里寫圖片描述圖品出自

為了跟蹤全局描述符表,處理器內部有一個48位的寄存器,稱為全局描述符表寄存器(GDTR)。該寄存器高32為存放全局描述符表線性基地址,低16位存放全局描述符表邊界。

因為GDT的界限是16位所以表的大小最多是2^16字節(64KB),又因為全局描述符大小為8字節,所以最多可以定義8192個描述符。

雖說基地址有32位,但是由于在進入保護模式之后,處理器立即要按新的內存訪問模式工作,所以,必須在進入保護模式之前定義GDT。但是,由于在實模式下只能訪問1MB的內存,故GDT通常都定義在1MB以下的范圍內。也允許在進入保護模式之后換位置重新定義GDT。

段描述符中的段屬性也被安排在兩個域中。下面對其定義及意義作說明。

(1)G為就是段界限粒度(Granularity)位

G=0表示界限粒度為字節;G=1表示界限粒度為4K 字節。注意,界限粒度只對段界限有效,對段基地址無效,段基地址總是以字節為單位。

(2)D/B位是一個很特殊的位在描述可執行段、向下擴展數據段或由SS寄存器尋址的段(通常是堆棧段)的三種描述符中的意義各不相同

在描述可執行段的描述符中,D位決定了指令使用的地址及操作數所默認的大小。

D=1表示默認情況下指令使用32位地址及32位或8位操作數,這樣的代碼段也稱為32位代碼段;

D=0 表示默認情況下,使用16位地址及16位或8位操作數,這樣的代碼段也稱為16位代碼段,它與80286兼容。可以使用地址大小前綴和操作數大小前綴分別改變默認的地址或操作數的大小。

在向下擴展數據段的描述符中,D位決定段的上部邊界。

D=1表示段的上部界限為4G;

D=0表示段的上部界限為64K。

在描述由SS寄存器尋址的段描述符中,D位決定隱式的堆棧訪問指令(如PUSH和POP指令)使用何種堆棧指針寄存器。

D=1表示使用32位堆棧指針寄存器ESP;

D=0表示使用16位堆棧指針寄存器SP。

(3)AVL位是軟件可利用位

80386對該位的使用未做規定,此位被linux和windows操作系統忽略。

(4)P位稱為存在(Present)位

P=1表示描述符對地址轉換是有效的,或者說該描述符所描述的段存在,即在內存中;P=0表示描述符對地址轉換無效,即該段不存在。使用該描述符進行內存訪問時會引起異常。

(5)DPL表示描述符特權級(Descriptor Privilege level)

共2位。它規定了所描述段的特權級,用于特權檢查,以決定對該段能否訪問。

(6)DT位說明描述符的類型

對于存儲段描述符而言,

DT=1,以區別與系統段描述符和門描述符(DT=0)。

(7)TYPE說明存儲段描述符所描述的存儲段的具體屬性

這里寫圖片描述

其中的位0指示描述符是否被訪問過(Accessed),用符號A標記。

A=0表示尚未被訪問,

A=1 表示段已被訪問,

當把描述符的相應選擇子裝入到段寄存器時,80386把該位置為1,表明描述符已被訪問,操作系統可測試訪問位,已確定描述符是否被訪問過。

此為位1,對應的type為奇數,因此type對應的數值為奇數時標識該描述符被訪問過,否則為偶數標識未被訪問過(可從前面的表中看出)

綜上我們可以看到在類型不同時,段描述符的區別之處,如下所示

代碼段描述符

表示這個段描述符代表一個代碼段,它可以放在GDT中。該描述符置S標志為1。

數據段描述符

表示這個段描述符代表一個數據段,它可以放在GDT中,該描述符置S標志為1。

任務狀態段描述符

表示這個段描述符代表一個任務狀態段,也就是說這個段用于保存處理器寄存器的內容。它只能出現在GDT中,根據相應的進程是否正CPU上運行,其Type字段的值分別為11或9。這個描述符的S標志置為0。 $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('

    ').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
  • ').text(i)); }; $numbering.fadeIn(1700); }); });

    本文轉載自wrx1721267632博客,版權歸wrx1721267632所有

    簡單地理解,保護模式中給每一個段都添加了一些權限的控制,還增加了執行權限的概念。每個段可以單獨設置可執行,可讀,可寫等權限。對于執行的時候,分為內核態和用戶態兩種,內核態可以執行一些特殊的指令,而用戶態只能只能執行一些比較簡單普通的指令,這樣可以防止用戶直接操作硬件。上面的特性都是實模式下沒有的內容來自www.13333515.buzz請勿采集。

免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
Copyright © 2017 www.13333515.buzz All Rights Reserved
3排列五开奖结果