核心學習之段暫存器

2021-06-22 04:16:46 字數 1813 閱讀 2398

關於段暫存器的介紹大部分只是介紹其分類和在定址中的應用,很少提到段暫存器如何去定址的。這幾天一直在糾結著方面的內容,今天算是大體明白了吧!

還是首先提一下段暫存器的作用和分類。在8086

模式下,對記憶體的訪問由段基址和段內偏移共同組成的。段暫存器存放的即各個分段的段基址。並指示了4

個正在使用的邏輯段,包括**段暫存器

cs、堆疊段暫存器

ss、資料段暫存器

ds和附加段資料暫存器

es。**段暫存器

cs存放正在執行的**的段基址,堆疊暫存器ss存放的是當前堆疊的段基址,資料段暫存器ds

存放的是當前資料段的段基址,

es為附加資料段的段基址。

深入了解段暫存器,我們首先介紹另乙個概念gdt

(全域性描述符表),在計算機剛剛啟動的時候首先執行在

real mode

(實模式)下,在實模式下計算機用20位定址(包括

bios

和記憶體定址)。

20位可以定址

1m的空間,這

20位的位址由

16位的段基址和

16位的段內偏移構成。實體地址=左移4

位的段位址

+偏移位址。也即是段內偏移定址空間為00000h~ffff0h.

為了提高cpu

的定址空間,在保護模式下

32位的

cpu可以定址

32空間,即最大為

4g空間。在保護模式下記憶體管理方式有兩種,段模式和頁模式,在此只考慮分段模式。在

32位的系統中,段基址和段內偏移都用

32位,因此,每個段的大小最大可為

4g。也可易知想要描述乙個段必須使用

64位去描述。但是

intel

為了向後相容段暫存器的大小仍是

16bit

,所以在此使用乙個陣列存放

64位的段描述符,而將暫存器中的值作為下標索引間接引用。這個描述符表就是

gdt。

保護模式下的段暫存器結構如下

段選擇器的16

位具體作用是,

index

用於索引

gdt表,

t1用於區分

gdt和

ldt表,

rpl用於區分優先順序。

在gdt

的索引中,每個

gdt在記憶體中都有乙個特定的位址,在建立

gdt之後,會將

gdt的位址賦給乙個叫gdtr的暫存器,該暫存器中存放的值就是gdt的入口。以後再呼叫

gdt的時候就可以直接引用該暫存器。上文中段暫存器的

index

就是在gdt

的索引的段基址的偏移量。由此可見

gdt中段基址的個數最多為

2的13次方個。另外,gdtr+index就是索引的段在

gdt中的位置。在獲取了段基址之後加上邏輯位址的

offset

,就可以得到實體地址,每個系統只有乙個唯一的

gdt表。與之對應的為

ldt,

ldt為區域性變數表。每個引用程式都有乙個

ldt,

gdt可以看成

ldt的一級索引。

在gdt和ldt中存放的是段描述符,段描述符為64位,這其中記錄了段基位址和段限長等方面的內容。

除了記憶體的段管理機制,還有分頁管理機制。具體內容還有待進一步學習。

windows核心 段暫存器

什麼是段暫存器?其實我們平常在od除錯中就可以看到,但是不會在意的,這裡顯示其實是段暫存器的一部分,稱為段選擇子,下面我們具體會講。還有就是我們平時在除錯中經常會看到的彙編 這裡其實我們真正寫入的位址是ds.base 0x12345678 除了在od中顯示的6個段暫存器以外其實還有2個,通常情況下,...

01 段暫存器

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

段暫存器和段基址

段暫存器是因為對記憶體的分段管理而設定的。計算機需要對記憶體分段,以分配給不同的程式使用 類似於硬碟分頁 在描述記憶體分段時,需要有如下段的資訊 1.段的大小 2.段的起始位址 3.段的管理屬性 禁止寫入 禁止執行 系統專用等 需要用8個位元組 64位 儲存這些資訊,但段暫存器只有16位,因此段暫存...