內存管理寄存器

處理器提供了4個內存管理寄存器(GDTR、LDTR、IDTR和TR),用於指定分段內存管理所使用的系統表的基地址。處理器爲這些寄存器加載和保存提供了特定的指令。
 
 
GDTR、LDTR、IDRTR和TR都是段基址寄存器,這些段中包含分段機制的重要信息表,GDTR、IDTR和LDTR用於尋址存放段描述符的段。TR用於尋址一個特殊任務狀態段TSS(Task State Segment)。TSS段中包含當前窒息感任務的重要信息。
1.全局描述符表寄存器GDTR
GDTR寄存器中用於存放全局描述符表GDT的32位線性基地址和16位表長度值。基地址指定GDT表中字節0在線性地址空間中的地址,表長度指明GDT表的字節長度值。指令LGDT和SGDT用於加載和保存GDTR寄存器的內容。在機器剛加電或處理器復位後,默認基地址設置爲0,而長度被設置成0XFFFF,在保護模式初始化過程中必須給GDTR加載一個新值。
2.中斷描述符表寄存器IDTR
與GDTR的作用類似,IDTR寄存器用於存放中斷描述符表IDT的32位線性基地址和16位表長度值,指令LIDT和SIDT分別用於加載和保存IDTR寄存器的內容。在機器剛加電或者處理復位後,基地址被默認設置爲0,而長度值設置爲0XFFFF。
3.局部描述符表寄存器LDTR
LDTR寄存器中用於存放局部描述符LDT的32位線性基地址、16位段限長和描述符屬性值。LLDT和SLDT分別用於加載和保存LDTR寄存器的段描述符部分。包含LDT表的段必須在GDT表中有一個段描述符項,當使用LLDT指令把含有LDT表段的選擇符加載進LDTR時,LDT段描述符的段基地址、段限長度以及描述符屬性會被自動加載到LDTR中。當進行任務切換時,處理器會把新任務的段選擇符合段描述符自動加載近LDTR中。在機器剛加電或者處理復位後,基地址被默認設置爲0,而長度值設置爲0XFFFF。
4.任務寄存器TR
TR寄存器用於存放當前任務TSS段的16位段選擇符、32位基地址、16位段長度和描述符屬性值。它引用GDT表中一個TSS類型的描述符。指令LTR和STR分別用於加載和保存TR寄存器的段選擇符部分。當使用LTR指令把選擇符加載近任務寄存器時,TSS描述符中的段基地址、段限長度以及描述符屬性會被自動的加載到任務寄存器中。當執行任務切換時,處理器會把新任務TSS的段選擇符和段描述符自動加載到TR寄存器中。
 

其中有一個寄存器叫做EIP(Instruction Pointer,指令寄存器),程序的執行就是靠EIP的不斷增加來完成的(跳轉的話,EIP就變成了跳轉到的地址)。在Windows系統下,進程並不擁有EIP,那麼只有進程,一個程序就無法運行。而擁有這些寄存器的是線程,所以說進程是靜態的。一個CPU下只有一個EIP,也就是說同一時刻只能有一個線程可以運行,那麼所說的多線程又是什麼呢?事實上同一時刻也只有一個線程在運行,每個線程運行一段時間後,它會把它擁有的EIP等寄存器讓出來,其它線程佔有這些寄存器後,繼續運行。 




爲了實現不同的線程之間的轉換,CPU要求操作系統維護一份固定格式的數據(該數據存在於內存中),這份數據叫做Task-State Segment(TSS),在這份數據結構裏,維護着線程的EAX,EIP,DS(Data Segment)等寄存器的內容。 




EAX—EDX可稱爲數據寄存器,你除了直接訪問外,還可分別對其高十六位和低十六位進行訪問。它們的低十六位就是把它們前邊兒的E去掉,即EAX的低十六位就是AX。而且它們的低十六位又可以分別進行八位訪問,也就是說,AX還可以再進行分解,即AX還可分爲AH(高八位)AL(低八位)。 

在32位程序中,32位以內的函數返回值都通過eax寄存器來傳遞——這是__stdcall和__ccall的調用約定形成的結果。Win32API函數(wsprintf使用__cdecl調用規則,其餘所有API函數都是用__stdcall調用規則)默認是是用eax返回值。高級語言特性+編譯器,通常將函數的返回值放在EAX中(單一返回值直接放EAX,如果多個返回值,則EAX中存放指針)。

 00000000 00000000 00000000 00000000
│               EAX                    │
                  │       AX           │
                  │   AH   │    AL     │

 

 

而CPU還有一個寄存器叫做Task Register(TR),該寄存器指向當前正在執行的線程的TSS。而線程切換事實上就是TR指向不同的TSS,這樣CPU就會自動保存當前的EAX,EBX的信息到相應的TSS中,並將新的線程的信息加載到寄存器。


32位CPU的寄存器包括

4個數據寄存器 : 

    EAX  (Accumulator) 

    EBX  (Base Register) 

    ECX  (Count Register)  

    EDX  (Data Register)

2個變址和指針寄存器(Index Register) :

    ESI   (Source Index Register)

    EDI   (Destination Index Register)

1個指令指針寄存器 :

    EIP    (Instruction Pointer)

2個指針寄存器(Pointer Register) :

    ESP   (Stack Pointer Register) 

    EBP   (Base Pointer Register)

6個段寄存器(Segment Register) 

    CS    (Code Segment Register)

    DS    (Data Segment Register)

    SS    (Stack Segment Register)

    ES    (Extra Segment Register)

    FS    (Extra Segment Register)

    GS    (Extra Segment Register)

1個標誌寄存器 :

    EFlags 


發佈了56 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章