[windows內核]段寄存器

什麼是段寄存器?
其實我們平常在OD調試中就可以看到,但是不會在意的,這裏顯示其實是段寄存器的一部分,稱爲段選擇子,下面我們具體會講。
在這裏插入圖片描述
還有就是我們平時在調試中經常會看到的彙編代碼
在這裏插入圖片描述
這裏其實我們真正寫入的地址是ds.base+0x12345678

除了在od中顯示的6個段寄存器以外其實還有2個,通常情況下,我們認爲有8個段寄存器,他們分別是

ES CS SS DS FS GS LDTR TR

其中,後四個寄存器沒有處理器定義,是由操作系統運行它們來賦予目的的。
段寄存器一共有96位,可見部分只有16位,也就是我們在od看到的段選擇子,還有80位是不可見的
段寄存器具有以下結構
在這裏插入圖片描述
結構體表示

struct SegMent
{
	WORD Selector;		// 段選擇子 16位 可見
	WORD Attributes;	// 段屬性  16位 不可見 只有少數幾個屬性位是有效的
	DWORD Base			// 段起始地址 32位 不可見  僅對於FS和GS有效
	DWORD Limit			// 段大小 32位 不可見   僅對於FS和GS有效
}

在對段寄存器進行讀寫時,通常我們採用以下格式
讀:

MOV AX,ES

寫:

MOV DS,AX

這裏要注意一點的是,段寄存器有96位,而AX寄存器只有16位,那在讀的時候我們可以正常的取低16位(Selector)讀入AX,而在寫時,就不太一樣了,仍然會將96位數據寫入Dst,那剩下的80位數據從何而來?
還有就是我們只能看見段寄存器16位,怎麼證明段寄存器有96位?

如果要解釋上面的這兩個問題就要引入一個GDT的概念
GDT(Global Descriptor Table 全局描述符表)

在設計程序時,我們認爲段寄存器爲16-bit(雖然每個段寄存器事實上有一個64-bit長的不可見部分,但對於程序員來說,段寄存器就是16-bit),但是爲了描述一個段,還需要【Base Address, Limit, Attr】三方面因素,它們加在一起被放在一個64-bit長的數據結構中,被稱爲段描述符(上面所說的缺少了80位數據,但是這裏只存儲64位數據是因爲80位中只有部分位是有效的)。也就是說,本應該需要64-bit的段寄存器來存儲段描述符,但Inter爲了向下兼容而規定段寄存器爲16-bit,這就需要程序在運行時能通過這16bit數據來找到64bit的段描述符。

怎麼解決呢? 解決方法就是將這個64-bit的段描述符放入一個數組中,而將段寄存器中的值作爲下標索引來間接引用(事實上,是將段寄存器中的高13 -bit的內容作爲索引)。這個全局的數組就是GDT。 但是,GDT這個數組中,存放的不僅僅是段描述符,還有其他的一些64-bit長的描述符。

GDT是Protected Mode所必須的數據結構,也是唯一的。且正如它的名字(GGDTlobal Descriptor Table)所示,它是全局可見的,對任何一個任務而言都是這樣。

具體的下篇再詳細講述。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章