段选择符和段寄存器
? ? 8086中有4個(gè)16位的段寄存器:CS、DS、SS、ES,分別用于存放可執(zhí)行代碼的代碼段、數(shù)據(jù)段、堆棧段和其他段的基地址。
? ? 80X86為段部分提供了6個(gè)存放段選擇符的段寄存器:CS、DS、ES、SS、FS和GS,但是,這些段寄存器中存放的不再是某個(gè)段的基地址,而是某個(gè)段的選擇符(Selector)。因?yàn)?6位的寄存器無法存放32位的段基地址,段基地址只好存放在一個(gè)叫做描述符表(Descriptor)的表中。因此,在80X86中,我們把段寄存器叫做選擇符。
其中CS總是用于尋址代碼段,而堆棧段則專門使用SS段寄存器。
在任何指定時(shí)刻由CS尋址的斷稱為當(dāng)前代碼段,此時(shí)EIP寄存其中包含了當(dāng)前代碼段內(nèi)下一條要執(zhí)行指令的段內(nèi)偏移地址,因此要執(zhí)行指令的地址可表示成CS:[EIP]。
由段寄存器SS尋址的段稱為當(dāng)前堆棧段,棧頂由ESP寄存器內(nèi)容指定,因此堆棧頂處地址是SS:[ESP]。
另外4個(gè)段寄存器是通用段寄存器,當(dāng)指令中沒有指定所操作數(shù)據(jù)的段時(shí),那么DS將是默認(rèn)的數(shù)據(jù)段寄存器。
以下來自對選擇符和描述符的介紹:http://www.kerneltravel.net/kernel-book/第二章%20Linux運(yùn)行的硬件基礎(chǔ)/2.3.5.htm
在實(shí)模式下,段寄存器存儲(chǔ)的是真實(shí)的段地址,在保護(hù)模式下,16位的段寄存器無法放下32位的段地址,因此,它們被稱為選擇符,即段寄存器的作用是用來選擇描述符。選擇符的結(jié)構(gòu)如圖2.16所示:? ? ? ? ? ? ??
???????????圖?2.16選擇符的結(jié)構(gòu)(Segment Selector)
可以看出,選擇符有三個(gè)域:第15~3位這13位是索引域,表示的數(shù)據(jù)為0~8129,用于指向全局描述符表中相應(yīng)的描述符。第二位為選擇域,如果TI=1,就從局部描述符表中選擇相應(yīng)的描述符,如果TI=0,就從全局描述符表中選擇描述符。第1、0位是特權(quán)級(jí),表示選擇符的特權(quán)級(jí),被稱為請求者特權(quán)級(jí)RPL(Requestor Privilege Level)。只有請求者特權(quán)級(jí)RPL高于(數(shù)字低于)或等于相應(yīng)的描述符特權(quán)級(jí)DPL,描述符才能被存取,這就可以實(shí)現(xiàn)一定程度的保護(hù)。
我們知道,實(shí)模式下是直接在段寄存器中放置段基地址,現(xiàn)在則是通過它來存取相應(yīng)的描述符來獲得段基地址和其它信息,這樣以來,存取速度會(huì)不會(huì)變慢呢?為了解決這個(gè)問題,386的每一個(gè)段選擇符都有一個(gè)程序員不可見(也就是說程序員不能直接操縱)的88位寬的段描述符高速緩沖寄存器與之對應(yīng)。無論什么時(shí)候改變了段寄存器的內(nèi)容,只要特權(quán)級(jí)合理,描述符表中的相應(yīng)的8字節(jié)描述符就會(huì)自動(dòng)從描述符表中取出來,裝入高速緩沖寄存器中(還有24位其他內(nèi)容)。一旦裝入,以后對那個(gè)段的訪問就都使用高速緩沖寄存器的描述符信息,而不會(huì)再重新從表中去取,這就大大加快了執(zhí)行的時(shí)間,如圖2.17所示。
圖?2.17?段描述符高速緩沖寄存器的作用由于段描述符高速緩沖寄存器的內(nèi)容只有在重新設(shè)置選擇符時(shí)才被重新裝入,所以,當(dāng)你修改了選擇符所選擇的描述符后,必須對相應(yīng)的選擇符重新裝入,這樣,88位描述符高速緩沖寄存器的內(nèi)容才會(huì)發(fā)生變化。無論如何,當(dāng)選擇符的值改變時(shí),處理器自動(dòng)裝載不可見部分。
下面講一下在沒有分頁操作時(shí),尋址一個(gè)存儲(chǔ)器操作數(shù)的步驟:
1.?在段選擇符中裝入16位數(shù),同時(shí)給出32位地址偏移量(比如在ESI、EDI中等等)
2.?根據(jù)段選擇符中的索引值、TI及RPL值,再根據(jù)相應(yīng)描述符表寄存器中的段地址和段界限,進(jìn)行一系列合法性檢查(如特權(quán)級(jí)檢查、界限檢查),該段無問題,就取出相應(yīng)的描述符放入段描述符高速緩沖寄存器中。
段描述符(Segment Descriptor)通用格式如下圖:
3.?將描述符中的32位段基地址和放在ESI、EDI等中的32位有效地址相加,就形成了32位物理地址。
注意:在保護(hù)模式下,32位段基地址不必向左移4位,而是直接和偏移量相加形成32位物理地址(只要不溢出)。這樣做的好處是:段不必再定位在被16整除的地址上,也不必左移4位再相加。
尋址過程如圖?2.18所示。
總結(jié)
- 上一篇: 操作系统开发系列—2.进入32位保护模式
- 下一篇: Bochs安装FreeDOS与调试