windows核心 段暫存器

2021-10-06 05:10:29 字數 1416 閱讀 1503

什麼是段暫存器?

其實我們平常在od除錯中就可以看到,但是不會在意的,這裡顯示其實是段暫存器的一部分,稱為段選擇子,下面我們具體會講。

還有就是我們平時在除錯中經常會看到的彙編**

這裡其實我們真正寫入的位址是ds.base+0x12345678

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

es cs ss ds fs gs ldtr tr
其中,後四個暫存器沒有處理器定義,是由作業系統執行它們來賦予目的的。

段暫存器一共有96位,可見部分只有16位,也就是我們在od看到的段選擇子,還有80位是不可見的

段暫存器具有以下結構

結構體表示

struct segment

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

讀:

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)所示,它是全域性可見的,對任何乙個任務而言都是這樣。

具體的下篇再詳細講述。

核心學習之段暫存器

關於段暫存器的介紹大部分只是介紹其分類和在定址中的應用,很少提到段暫存器如何去定址的。這幾天一直在糾結著方面的內容,今天算是大體明白了吧!還是首先提一下段暫存器的作用和分類。在8086 模式下,對記憶體的訪問由段基址和段內偏移共同組成的。段暫存器存放的即各個分段的段基址。並指示了4 個正在使用的邏輯...

01 段暫存器

引言 要學習保護模式中段的機制,首先就要學習段暫存器。首先,我們來看一下下面這段 mov dword ptr ds 0x123456 eax 在上面我們真正讀寫的位址是 ds.base 0x123456 中的ds就是我們這裡要介紹的段暫存器,base是段暫存器中的成員 為了更直觀的了解段暫存器,我們...

Windows核心基礎之控制暫存器

控制暫存器用於控制和確定cpu的操作模式。主要有 cr0 cr1 cr2 cr3 cr4 pe 啟用保護模式的標誌,1是保護模式,0是實模式,這個位只是開始或者關閉段機制,並沒有啟用分頁機制。pg 分頁機制開關,在啟用之前需要確保pe是開啟的,否則會出現異常。wp 寫保護標誌,禁止ring0程式想r...