段選擇符用來表示指向哪個段描述符,即用來在段描述符中定址,前13位是位址,能尋0到(2^13)-1,因此段描述符表的大小就是 8192,他還牽扯到一些特權級的限制,後三位;段描述符是用來表示這個段的一些性質的,比如段基址和段長之類的。我們在定址的時候,一般是從段選擇符找 到段描述符,然後從段描述符中取出段基址,加上偏移就形成了我們要訪問的位址。
在 80386中,有6個16位的段暫存器,但是,這些段暫存器中存放的不再是某個段的基位址,而是某個段的選擇符(selector)。因為16位的暫存器 無法存放32位的段基位址,段基位址只好存放在乙個叫做描述符表(descriptor)的表中。因此,在80386中,我們把段暫存器叫做選擇符。下面 給出6個段暫存器的名稱和用途:
cs **段暫存器
ds 資料段暫存器
ss 堆疊段暫存器
es、fs及gs 附加資料段暫存器
下面是對選擇符和描述符的介紹:
選擇符與描述符表暫存器
在實模式下,段暫存器儲存的是真實的段位址,在保護模式下,16位的段暫存器無法放下32位的段位址,因此,它們被稱為選擇符,即段暫存器的作用是用來選擇描述符。選擇符的結構如圖2.16所示:
圖 2.16選擇符的結構
可 以看出,選擇符有三個域:第153位這13位是索引域,表示的資料為08192,用於指向全域性描述符表中相應的描述符。第二位為選擇域,如果 ti=1,就從區域性描述符表中選擇相應的描述符,如果ti=0,就從全域性描述符表中選擇描述符。第1、0位是特權級,表示選擇符的特權級,被稱為請求者特權級rpl(requestor privilege level)。只有請求者特權級rpl高於(數字低於)或等於相應的描述符特權級dpl,描述符才能被訪問,這就可以實現一定程度的保護。
我 們知道,實模式下是直接在段暫存器中放置段基位址,現在則是通過它來訪問相應的描述符來獲得段基位址和其它資訊,這樣以來,訪問速度會不會變慢呢?為了解 決這個問題,386的每乙個段選擇符都有乙個程式設計師不可見(也就是說程式設計師不能直接操縱)的88位(8*8+24)寬的段描述符高速緩衝暫存器與之對應。 無論什麼時候改變了段暫存器的內容,只要特權級合理,描述符表中的相應的8位元組描述符就會自動從描述符表中取出來,裝入高速緩衝暫存器中(還有24位其他 內容)。一旦裝入,以後對那個段的訪問就都使用高速緩衝暫存器的描述符資訊,而不會再重新從表中去取,這就大大加快了執行的時間,如圖2.17所示
由於段描述符高速緩衝暫存器的內容只有在重新設定選擇符時才被重新裝入,所以,當你修改了選擇符所選擇的描述符後,必須對相應的選擇符重新裝入,這樣,88位描述符高速緩衝暫存器的內容才會發生變化。無論如何,當選擇符的值改變時,處理器自動裝載不可見部分。
下面講一下在沒有分頁操作時,定址乙個儲存器運算元的步驟:
在段選擇符中裝入16位數,同時給出32位位址偏移量(比如在esi、edi中等等)
根據段選擇符中的索引值、ti及rpl值,再根據相應描述符表暫存器中的段位址和段界限,進行一系列合法性檢查(如特權級檢查、界限檢查),該段無問題,就取出相應的描述符放入段描述符高速緩衝暫存器中。
將描述符中的32位段基位址和放在esi、edi等中的32位有效位址相加,就形成了32位實體地址。
定址過程如圖 2.18所示。
段描述符與段選擇子
存放的是gdt 全域性描述符表 表的位置和大小,大小為48位 在windeg中 r gdtr 檢視gdt表的位置 r gdtl 檢視表的大小 gdt表裡面存放的元素稱為段描述符 大小為8位元組 dd 位址 檢視位址裡面的內容 檢視4位元組 dq 位址 檢視8位元組 eq 位址 8位元組資料 往指定位...
段選擇器 段描述符 段描述符表 線性位址形成
買了本羅老師的琢石成器,才看前3章就感覺暈暈忽忽,總體覺得要看懂這本書前提是必須會dos彙編,了解32位彙編基礎.dos彙編本人只看了王爽老師的組合語言前11章,中斷這塊還沒有看,看來不看還是不行的。轉回來說,羅老師這本書前3章寫的很亂,尤其是描述符這塊,看了似懂非懂,通而不透。只能自己抽絲剝繭,捋...
段選擇器 段描述符 段描述符表 線性位址形成
段選擇器 32位彙編中16位段暫存器 cs ds es ss fs gs 中不再存放段基址,而是段描述符在段描述符表中的索引值,d3 d15位是索引值,d0 d1位是優先順序 rpl 用於特權檢查,d2位是描述符表引用指示位ti,ti 0指示從全域性描述表gdt中讀取描述符,ti 1指示從區域性描述...