天天看點

linux運作的硬體基礎

1、i386 的寄存器

   80386作為80X86系列中的一員,必須保證向後相容,也就是說,既要支援16位的處理器,也要支援32位的處理器。在8086中,所有的寄存器都是16位的,下面我們來看一下80386中寄存器有何變化:

·      把16位的通用寄存器、标志寄存器以及指令指針寄存器擴充為32位的寄存器

·      段寄存器仍然為16位。

·      增加4個32位的控制寄存器

·      增加4個系統位址寄存器

·      增加8個調式寄存器

·      增加2個測試寄存器

2、通用寄存器

通用寄存器可用于傳送和暫存資料,也可參與算術邏輯運算,并儲存運算結果。除此之外,它們還各自具有一些特殊功能。彙編語言程式員必須熟悉每個寄存器的一般用途和特殊用途,隻有這樣,才能在程式中做到正确、合理地使用它們。

linux運作的硬體基礎
linux運作的硬體基礎

16位寄存器組

32位寄存器組

32位寄存器組除了包含了先前CPU的所有寄存器,并進行了寄存器位數擴充之外,還增加了2個16位的段寄存器:FS和GS。

1、資料寄存器

資料寄存器主要用來儲存操作數和運算結果等資訊,進而節省讀取操作數所需占用總線和通路存儲器的時間。

32位CPU有4個32位的通用寄存器EAX、EBX、ECX和EDX。對低16位資料的存取,不會影響高16位的資料。這些低16位寄存器分别命名為:AX、BX、CX和DX,它和先前的CPU中的寄存器相一緻。

4個16位寄存器又可分割成8個獨立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每個寄存器都有自己的名稱,可獨立存取。程式員可利用資料寄存器的這種“可分可合”的特性,靈活地處理字/位元組的資訊。

寄存器AX和AL通常稱為累加器(Accumulator),用累加器進行的操作可能需要更少時間。累加器可用于乘、除、輸入/輸出等操作,它們的使用頻率很高;

寄存器BX稱為基位址寄存器(Base Register)。它可作為存儲器指針來使用;

寄存器CX稱為計數寄存器(Count Register)。在循環和字元串操作時,要用它來控制循環次數;在位操作中,當移多位時,要用CL來指明移位的位數;

寄存器DX稱為資料寄存器(Data Register)。在進行乘、除運算時,它可作為預設的操作數參與運算,也可用于存放I/O的端口位址。

在16位CPU中,AX、BX、CX和DX不能作為基址和變址寄存器來存放存儲單元的位址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不僅可傳送資料、暫存資料儲存算術邏輯運算結果,而且也可作為指針寄存器,是以,這些32位寄存器更具有通用性。詳細内容請見第3.8節——32位位址的尋址方式。

2、變址寄存器

32位CPU有2個32位通用寄存器ESI和EDI。其低16位對應先前CPU中的SI和DI,對低16位資料的存取,不影響高16位的資料。

寄存器ESI、EDI、SI和DI稱為變址寄存器(Index Register),它們主要用于存放存儲單元在段内的偏移量,用它們可實作多種存儲器操作數的尋址方式(在第3章有詳細介紹),為以不同的位址形式通路存儲單元提供友善。

變址寄存器不可分割成8位寄存器。作為通用寄存器,也可存儲算術邏輯運算的操作數和運算結果。

它們可作一般的存儲器指針使用。在字元串操作指令的執行過程中,對它們有特定的要求,而且還具有特殊的功能。

3、指針寄存器

32位CPU有2個32位通用寄存器EBP和ESP。其低16位對應先前CPU中的BP和SP,對低16位資料的存取,不影響高16位的資料。

寄存器EBP、ESP、BP和SP稱為指針寄存器(Pointer Register),主要用于存放堆棧記憶體儲單元的偏移量,用它們可實作多種存儲器操作數的尋址方式,為以不同的位址形式通路存儲單元提供友善。

指針寄存器不可分割成8位寄存器。作為通用寄存器,也可存儲算術邏輯運算的操作數和運算結果。

它們主要用于通路堆棧内的存儲單元,并且規定:

BP為基指針(Base Pointer)寄存器,用它可直接存取堆棧中的資料;

SP為堆棧指針(Stack Pointer)寄存器,用它隻可通路棧頂。

4、段寄存器

段寄存器是根據記憶體分段的管理模式而設定的。記憶體單元的實體位址由段寄存器的值和一個偏移量組合而成的,這樣可用兩個較少位數的值組合成一個可通路較大實體空間的記憶體位址。

CPU内部的段寄存器:

CS——代碼段寄存器(Code Segment Register),其值為代碼段的段值;

DS——資料段寄存器(Data Segment Register),其值為資料段的段值;

ES——附加段寄存器(Extra Segment Register),其值為附加資料段的段值;

SS——堆棧段寄存器(Stack Segment Register),其值為堆棧段的段值;

FS——附加段寄存器(Extra Segment Register),其值為附加資料段的段值;

GS——附加段寄存器(Extra Segment Register),其值為附加資料段的段值。

在16位CPU系統中,它隻有4個段寄存器,是以,程式在任何時刻至多有4個正在使用的段可直接通路;在32位微機系統中,它有6個段寄存器,是以,在此環境下開發的程式最多可同時通路6個段。

32位CPU有兩個不同的工作方式:實方式 和 保護方式。在每種方式下,段寄存器的作用是不同的。有關規定簡單描述如下:

實方式:

前4個段寄存器CS、DS、ES和SS與先前CPU中的所對應的段寄存器的含義完全一緻,記憶體單元的邏輯位址仍為“段值:偏移量”的形式。為通路某記憶體段内的資料,必須使用該段寄存器和存儲單元的偏移量。

保護方式:

在此方式下,情況要複雜得多,裝入段寄存器的不再是段值,而是稱為“選擇子”(Selector)的某個值。段寄存器的具體作用在此不作進一步介紹了,有興趣的讀者可參閱其它科技資料。

5、指令指針寄存器

32位CPU把指令指針擴充到32位,并記作EIP,EIP的低16位與先前CPU中的IP作用相同。

指令指針EIP、IP(Instruction Pointer)是存放下次将要執行的指令在代碼段的偏移量。在具有預取指令功能的系統中,下次要執行的指令通常已被預取到指令隊列中,除非發生轉移情況。是以,在了解它們的功能時,不考慮存在指令隊列的情況。

在實方式下,由于每個段的最大範圍為64K,是以,EIP中的高16位肯定都為0,此時,相當于隻用其低16位的IP來反映程式中指令的執行次序。

狀态和控制寄存器

狀态和控制寄存器是由标志寄存器EFLAGS、指令指針EIP和4個控制寄存器組成,如圖2.1所示:

标志寄存器

指令指針

機器狀态字

Intel保留

頁故障位址

頁目錄位址

                                                       EFLAGS

                                                       EIP

                                                       CR0

                                                       CR1

                                                       CR2

                                                       CR3

                                   圖2.1狀态和控制寄存器

 1.指令指針寄存器和标志寄存器

   指令指針寄存器EIP中存放下一條将要執行指令的偏移量(offset ),這個偏移量是相對于目前正在運作的代碼段寄存器CS而言的。偏移量加上目前代碼段的基位址,就形成了下一條指令的位址。EIP中的低16位可以分開來進行通路,給它起名叫指令指針IP寄存器,用于16位尋址。

   标志寄存器EFLAGS存放有關處理器的控制标志,如圖2.2所示。标志寄存器中的第1、3、5、15位及18~31位都沒有定義。

                     圖2.2 i386标志寄存器EFLAGS

    在這些标志位中,我們隻介紹在Linux核心代碼中常用且重要的幾個标志位:

第8位TF(Trap Flag)是自陷标志,當将其置1時則可以進行單步執行。當指令執行完後,就可能産生異常1的自陷(參看第四章)。也就是說,在程式的執行過程中,每執行完一條指令,都要由異常1處理程式 (在Linux核心中叫做debug())進行檢驗。當将第8位清0後,且将斷點位址裝入調試寄存器DR0~DR3時,才會産生異常1的自陷。                                  

第12、13位IOPL是輸入輸出特權級位,這是保護模式下要使用的兩個标志位。由于輸入輸出特權級标志共兩位,它的取值範圍隻可能是0、1、2和3共4個值,恰好與輸入輸出特權級0~3級相對應。但Linux核心隻使用了兩個級别,即0和3級,0表示核心級,3表示使用者級。在目前任務的特權級CPL(Current Privilege Level)高于或等于輸入輸出特權級時,就可以執行像IN、OUT、INS、OUTS、STI、CLI和LOCK等指令而不會産生異常13(即保護異常)。在目前任務特權級CPL為0時,POPF(從棧中彈出至标志位)指令和中斷傳回指令IRET可以改變IOPL字段的值。

第9位IF(Interrupt Flag)是中斷标志位,是用來表示允許或者禁止外部中斷(參看第四章)。若第9位IF被置為1,則允許CPU接收外部中斷請求信号;若将IF位清0,則表示禁止外部中斷。在保護模式下,隻有當第12、13位指出目前CPL為最高特權級時,才允許将新值置入标志寄存器EFLAGS以改變IF位的值。

第10位DF(Direction Flag)是定向标志。DF位規定了在執行串操作的過程中,對源變址寄存器ESI或目标變址寄存器EDI是增值還是減值。如果DF為1,則寄存器減值;若DF為0,則寄存器值增加。

第14位NT是嵌套任務标志位。在保護模式下常使用這個标志。當80386在發生中斷和執行CALL指令時就有可能引起任務切換。若是由于中斷或由于執行CALL指令而出現了任務切換,則将NT置為1。若沒有任務切換,則将NT位清0。

第17位VM (Virtual 8086 Mode Flag)是虛拟8086方式标志,是80386新設定的一個标志位。表示80386CPU是在虛拟8086環境中運作。如果80386CPU是在保護模式下運作,而VM為又被置成1,這時80386就轉換成虛拟8086操作方式,使全部段操作就像是在8086CPU上運作一樣。VM位隻能由兩種方式中的一種方式給予設定,即或者是在保護模式下,由最高特權級(0)級代碼段的中斷傳回指令IRET設定,或者是由任務轉換進行設定。Linux核心實作了虛拟8086方式,但在本書中我們不準備對此進行詳細讨論。

   從上面的介紹可以看出,要正确了解标志寄存器EFLAGS的各個标志需要很多相關的知識,有些内容在本章的後續部分還會涉及到。在後面的章節中,你會體會如何靈活應用這些标志。

2.控制寄存器

 狀态和控制寄存器組除了EFLAGS、EIP ,還有四個32位的控制寄存器,它們是CR0,CR1,CR2和CR3。現在我們詳細看看它們的結構,如圖 2-3所示。

                    圖 2-3 386中的控制寄存器組

這幾個寄存器中儲存全局性和任務無關的機器狀态。

CR0中包含了6個預定義标志,0位是保護允許位PE(Protedted Enable),用于啟動保護模式,如果PE位置1,則保護模式啟動,如果PE=0,則在實模式下運作。1位是監控協處理位MP(Moniter coprocessor),它與第3位一起決定:當TS=1時操作碼WAIT是否産生一個“協處理器不能使用”的出錯信号。第3位是任務轉換位(Task Switch),當一個任務轉換完成之後,自動将它置1。随着TS=1,就不能使用協處理器。CR0的第2位是模拟協處理器位 EM

(Emulate coprocessor),如果EM=1,則不能使用協處理器,如果EM=0,則允許使用協處理器。第4位是微處理器的擴充類型位ET(Processor Extension Type),其内儲存着處理器擴充類型的資訊,如果ET=0,則辨別系統使用的是287協處理器,如果 ET=1,則表示系統使用的是387浮點協處理器。CR0的第31位是分頁允許位(Paging Enable),它表示晶片上的分頁部件是否允許工作,下一節就會講到。由PG位和PE位定義的操作方式如圖2.4 所示。

                        圖 2-4   PG位和PE位定義的操作方式   

CR1是未定義的控制寄存器,供将來的處理器使用。

CR2是頁故障線性位址寄存器,儲存最後一次出現頁故障的全32位線性位址。

CR3是頁目錄基址寄存器,儲存頁目錄表的實體位址,頁目錄表總是放在以4K位元組為機關的存儲器邊界上,是以,它的位址的低12位總為0,不起作用,即使寫上内容,也不會被理會。

     這幾個寄存器是與分頁機制密切相關的,是以,在程序管理及虛拟記憶體管理中會涉及到這幾個寄存器,讀者要記住CR0、CR2及CR3這三個寄存器的内容。

3、16位、32位和64位作業系統的差別

我們這裡先講32bit與64bit系統的差別:

大體上來講,64位的系統比32位的系統計算處理能力更精确更加強.-----------用電腦計算時有64位數字可以顯示出來,而我們普通的32位系統最精确隻能顯示32個數字,這是一個小的差別.---------最主要的差別就是64位的XP需要你的CPU也是64位的.64位的技術比32位先進,但由于配套的相關的軟硬體技術尚未成熟,很多情況下64位系統隻能運作32位軟體,現在的64位系統就象是一部跑車由于沒有公路隻能在農田裡跑一樣.

--32位、64位代表的是使用cpu位數(64,32)

有時候人們懷疑一個系統的底層結構能否保證這個系統在被使用時達到安全而高效,64位版本的Windows在這方面就比較完美。Windows XP和 Windows Server 2003都是運作64位硬體的64位版本作業系統。64位Windows作業系統運作64位代碼,同時通過使用WoW64 (Windows on Windows 64)也能運作32位代碼。

你看,這并不是什麼大問題,畢竟,32位版本的不同Windows作業系統都用來同時運作32位和16位代碼。(技術上說,并不是同時運作,相關解釋在以後的技巧中會展示給大家)

32位版本的Windows在如何允許32為和16位代碼并肩運作方面有着很複雜的機制。然而,這個系統被設計成無論你是系統管理者還是臨時使用者,你都不需要知道這些機制如何運作。

但是64位版本的Windows就不同了。從一個使用者的立場上看,64位應用程式和32位應用程式簡單地同時運作,沒有什麼特殊的。但是對于一個管理者 (和幫助桌面使用者的人員)來說,這其中就有很大不同了:32位代碼與64位代碼相隔離。這個隔離是如此重要以至于64位版本的Windows有兩個系統資料庫,一個是針對64位,一個是針對32位。

盡管64位版本的Windows XP和Windows Server 2003看起來在操作時候和它們32位的版本幾乎同樣的,但是在表象之下其實是有很大不同的。如果你在64位版本的Windows下按照32位版本一樣來執行某些程式,你可能引起一些麻煩。

---------------------------------------------

16、32、64位是指cpu可尋址的長度。例如32位計算機,CPU可尋址的範圍是0到2的32次方減1,也就是說記憶體最大可達2的32次方個位元組,也就是4GB.

機器使用位數來表示是說每個機器在一個cpu時間裡面并行處理2進制位的位數。32位的計算機是說我們的cpu在一個時間段裡面能并行處理32位2進制數,作業系統也是一樣的。

------所謂16位、32位、64位等術語有時指總線寬度,有時指指令寬度(在定長指令集中),

而在作業系統理論中主要是指記憶體尋址的寬度。如果記憶體的尋址寬度是16位,那麼每一個記憶體位址可以用16個二進制位來表示,也就是說可以在64KB的範圍内尋址。

同樣道理32位的寬度對應4GB的尋址範圍,64位的寬度對應16 Exabyte的尋址範圍。記憶體尋址範圍并非僅僅是對作業系統而言的,其他類型的軟體的設計有時也會被尋址範圍而影響。但是在作業系統的設計與實作中,尋址範圍卻有着更為重要的意義。

--專家對此解答說:“當計算機面臨大量的資料流時,32位的寄存器和指令集不能及時進行相應的處理運算。32位處理器一次隻能處理32位,也就是4個位元組的資料;而64位處理器一次就能處理64位,即8個位元組的資料。形象地說,32位好像是一個狹窄的單車道,當車流過多的時候,就無法承載這些負荷,而64位好比一個寬闊的高速公路,是以在多任務,多程式處理的情況下,應用64位計算平台才能随心所欲的加速、把電腦的應用性能發揮到最好。”

4 系統位址寄存器

  80386有4個系統位址寄存器,如圖2.5所示,它儲存作業系統要保護的資訊和位址轉換表資訊:

      47   32位基位址  16 15  界限     0

GDTR

IDTR

                                                          TR

LDTR

                          圖2.5   80386系統位址寄存器

這4個專用寄存器用于引用在保護模式下所需要的表和段,它們的名稱和作用如下:

·      全局描述符表寄存器GDTR(Global Descriptor Table Register ),是48位寄存器,用來儲存全局描述符表(GDT)的32位基位址和16為GDT的界限。

·      中斷描述符表寄存器IDTR(Interrupt Descriptor Table Register),是48位寄存器,用來儲存中斷描述符表(IDT)的32位基位址和16為IDT的界限。

·      局部描述符表寄存器LDTR(Global Descriptor Table Register ),是16位寄存器,儲存局部描述符表LDT段的選擇符。

·      任務狀态寄存器TR(Task State Register)是16位寄存器,用于儲存任務狀态段TSS段的16位選擇符。

    用以上4個寄存器給目前正在執行的任務(或程序)定義任務環境、位址空間和中斷向量空間。有關全局描述符表GST、中斷描述符表IDT、局部描述符表LDT及任務狀态段TSS的具體内容将在稍後進行較長的描述。

繼續閱讀