實模式下的段尋址
以8086爲例
8086 段寄存器16位(段地址/基地址),寄存器16位(偏移地址),地址總線20位(尋址1M:2^20)
實際物理地址 = (段寄存器 << 4) + 偏移地址
訪問到的是實地址。
段內最大64K(2^16),但一個段可以小於64K:
在編程時可以根據需要,將若干個地址連續的內存單元看做一個段,用段地址×16定位段的起始地址(基地址),用偏移地址定位段中的內存單元
如下圖所示,我們可以認爲:地址10000H~100FFH的內存單元組成一個段,該段的起始地址(基礎地址)爲10000H,段地址爲1000H,大小爲100H;我們也可以認爲地址10000H~1007F、10080H~100FHH的內存單元組成兩個段,它們的起始地址(基礎地址)爲:10000H和10080H,段地址爲:1000H和1008H,大小都爲80H
尋址方式:
MOV AX, [SI] : PA(物理地址) = DS:SI
MOV AX, [1234H] : PA = 段地址 + 直接地址
默認段地址都使用DS,也可以指定爲CS、SS、ES:
MOV AX, ES:[1234H] : 段地址使用ES
注意!!
在實模式下(包括32位等),內存尋址方式與8086相同,基地址16位移4位後加上偏移地址形成20位物理地址,最大尋址空間爲1MB,與32位的保護模式基地址不需要左移不一樣
- 在實模式下最大尋址空間時1M,1M以上的內存空間在實模式下不會被使用
- 在實模式所有的內存數據都可以被訪問。不存在用戶態、內核態之分
- 在BIOS加載、MBR、ntdlr啓動階段都處在實模式下
保護模式下的段尋址
80286時代地址總線位數增加到24位,可訪問16MB,80386爲4GB
引入保護模式
- 保護模式:在執行多任務操作時,對不同任務使用的虛擬存儲器空間進行完全的隔離,保護每個任務順利執行
在保護模式下,分段機制是利用一個稱作段選擇子的偏移量到全局描述符表中找到需要的段描述符,而這個段描述符中就存放着真正的段的物理首地址,然後再加上偏移地址量便得到了最後的物理地址
- 在32位平臺上,段物理首地址和偏移址都是 32 位的,實際物理地址的計算不再需要將段首地址左移 4 位了,直接相加即可,如果發生溢出的情況,則將溢出位捨棄
段描述符:段物理首地址(32位)、段界限(20位)、段屬性(12位)
全局描述符表:(數組)維護段描述符結構體
段選擇子:對應段描述符結構體在全局描述符表中的下標
保護模式尋址:xxxx(16位的索引): yyyyyyyy(32位的偏移量)
80386及其以後的處理器用寄存器 GDTR專門存儲全局描述符表在內存中的位置
GDTR共48位:32位記錄描述符表的物理地址,16位記錄描述符表的長度(字節數)
段描述符結構如下圖:
段基址爲 2,3,4,7 字節,共 32 位。段限長爲 0,1 以及 6 字節的低四位,共 20 位
G:段限長粒度,G = 0 時,粒度爲 1B,G = 1 時,粒度爲 1 頁(4KB)
D/B:對於不同類型段含義不同。在可執行代碼段中,這一位叫做 D 位,D = 1 使用 32位地址和 32/8 位操作數,D = 0 使用 16 位地址和 16/8 位操作數。在向下擴展的數據段中,這一位叫做 B 位,B = 1 段的上界爲 4GB,B = 0 段的上界爲 64KB。在描述堆棧段的描述符中,這一位叫做 B 位,B = 1 使用 32 位操作數,堆棧指針用 ESP,B = 0 使用 16 位操作數,堆棧指針用 SP。
- 個人理解: G、D/B的存在以及段地址、段限長的奇妙分佈是爲了兼容80286和80386,因爲80286的段地址24位,寄存器16位。G、D/B爲0時表示80286
實模式下 PA = ES:偏移 = ES存放的段基址 + 偏移地址
保護模式下 PA = ES:偏移,ES存放的是段選擇子(16位的索引),根據段選擇子從GDT表中找到段描述符的段基址,然後偏移
保護模式下的地址形成
- 將48位邏輯地址xxxx(16位的索引): yyyyyyyy(32位的偏移量)轉化爲32位的線性地址(稱爲分段,由分段部件SU完成)
- 將32位的線性地址轉化爲32位的物理地址(稱爲分頁,由分頁部件PU完成)
- 索引*8:一個段描述符八字節,GDT中存放的是完整的段描述符,索引只是給出它的序號
CR0:0位PE,是否進入保護模式(1進入);31位PG,是否啓動分頁(1啓動)
-
邏輯地址:程序中給出的地址,如 MOV EAX, [12345678],邏輯地址爲 DS:[12345678],DS存放段選擇子(16位的索引)
-
線性地址:由段轉換得到的地址 4GB
-
物理地址:地址總線上的實際物理內存地址 4GB
段選擇子(段寄存器DS的值):
-
RPL:請求特權級(2位),構成選擇子的特權,0最高,3最低
-
TI:描述符表指示器,0選擇全局描述符表(GDT),1選擇局部描述符表(LDT)
-
索引:描述符所在地址(13位),可指示2^13=8K個描述符
因此虛擬地址空間最大爲2^13 *2*2^32=64TB
例1:
已知:GDT和LDT的首地址分別爲55600000H和00013000H,FS=000BH,CR3=00013000H , ESI=0000125AH,內存有關數據如圖所示。執行指令MOV EAX,FS:[ESI],求:
- PE=0時源操作對應的物理地址及EAX中的值
- PE=1且PG=0時源操作對應的物理地址及EAX中的值
- PE=1且PG=1時源操作對應的物理地址及EAX中的值
CR0:0位PE,是否進入保護模式(1進入);31位PG,是否啓動分頁(1啓動)
(1)PE=0,工作在實模式下,因此物理地址=基地址×16+偏移地址=FS<<4+ESI=00B0H+0000125AH=0130AH,故讀出數據EAX=49102512H
(2)PE=1且PG=0,工作在保護模式,不開啓分頁,FS=000BH=0000 0000 0000 1011,PRL=3,TI=0,索引=1,因此從GDT中尋找段描述符首地址=GDT首地址+索引×8=55600000H+1×8H=55600008H,**讀出段描述符內容(共8字節) ** 01444900700001FFH,根據圖1-4,第2,3,4,7個字節爲基地址,因此基地址=01007000H,物理地址=基地址+偏移地址=01007000H+0000125AH=0100825AH,故讀出數據EAX=12009966H
(3)詳解見例2
保護模式下中斷的管理
中斷向量表的基地址存放在IDTR寄存器中
頁式存儲器地址映像與變換
頁式存儲器將地址轉換得到的線性地址**(虛擬地址)轉化爲物理地址**,即上文所說的分頁過程
CR0的31位PG置1表示開啓分頁模式
-
主存和輔存空間都分別劃分爲多個相同尺寸的定長塊,每塊稱爲一頁,並按順序編號。微處理器把頁面尺寸定爲4KB(2^12)
-
頁式存儲器中,每個任務都有頁表作爲虛擬空間映射到物理空間的中介,如圖中程序由4頁組成
-
組成頁表的行稱作頁表項,頁表項包括頁面基址和控制位,頁式存儲器通過頁表項對頁面進行管理。頁表本身也是一頁,存儲在主存中
二級頁表
- 第一級頁表爲頁表目錄,其頁表項指明第二級頁表中各頁表的地址
- 頁目錄表頁面的物理地址存放在CR3中,僅高20位有效,低12位必須設置爲0(因爲頁面4K對齊)
- 第二級頁表的頁表項將線性地址(虛擬地址)映射到物理地址(實地址)
重新理清一下各種地址的概念:
-
邏輯地址:程序中給出的地址,如 MOV EAX, [12345678],邏輯地址爲 DS:[12345678],DS存放段選擇子(16位的索引)邏輯地址包括 基地址: 偏移地址
-
線性地址:由段轉換得到的地址
-
物理地址:地址總線上的實際物理內存地址
一般好像線性地址稱爲虛擬地址,圖中的”(虛地址)“標註有些不準確
上一節保護模式下段尋址最終得到的地址即爲圖中的線性地址,頁式存儲器將其轉化爲物理存儲器的物理地址
Q:頁目錄表基址(保存在CR3)爲物理地址,但GDT表基址(保存在GDTR)爲線性地址,爲什麼?
A:在開啓了分頁後,除了cr3
,所有地址都要經過MMU自動進行虛擬地址到物理地址的轉換,這個是無法繞過的。而對於cr3
,是指明物理頁面的地址,用來在物理內存中找物理頁表的,就必須使用物理地址,也是不可避免的,所以cr3
是特例。
頁表項(頁描述符)
-
頁表項共32位,其中高20位是頁面基址,在頁表中表示實頁號,在頁目錄表中頁面基址*2^12=相應頁表的首地址
乘2^ 12:一個頁面尺寸爲4KB(2^ 12),和GDT表相同,頁目錄表的索引給出的是第二級頁表的序號
-
低12位說明頁(頁表)的控制狀態信息
- P:存在爲,P=1時表示頁表在主存中,若P=0表示需要立即訪問的頁不在主存,這種情形稱爲頁面失效(頁面故障)
-
兩級頁表中的頁表項作用不同,但格式完全一樣
例2:(續例1)
已知:GDT和LDT的首地址分別爲55600000H和00013000H,FS=000BH,CR3=00013000H , ESI=0000125AH,內存有關數據如圖所示。執行指令MOV EAX,FS:[ESI],求:
CR3:含有存放頁目錄表頁面的物理地址,僅高20位有效,低12位必須設置爲0
- 聽說GDTR存放的是線性地址!我目前還沒搞懂。。
- PE=1且PG=1時源操作對應的物理地址及EAX中的值
(3)在PG=1,即保護模式開啓分頁的情況下,由基地址+偏移地址=01007000H+0000125AH=0100825AH求得的值並不能作爲物理地址直接讀取EAX,而是作爲線性地址(虛擬地址)。如下圖:
線性地址二進制表示爲 0000 0001 0000 0000 1000 0010 0101 1010
-
從一級頁表找二級頁表地址:虛擬地址高10位0000 0001 00爲頁目錄索引,從CR3=00013000H讀出頁目錄表基址,每個頁表項(頁描述符)佔四個字節,因此得到頁目錄表中的相應項地址=頁表目錄基址(CR3)+目錄索引*4=00013000H+0000 0001 00B*4=00013000H+0010H=00130010H
頁表項佔四個字節,從例1的圖中地址00130010H讀出四個字節55600040H爲頁表項內容
根據圖13,高20位爲頁面基址,因此頁表首地址=頁面基址*2^12 =00055600H*2^12=55600000H
-
從二級頁表找實頁號:虛地址12-21位00 0000 1000爲頁索引,得到頁中目錄項地址=頁表首地址+頁索引*4=55600000H+0020H=55600020H,從例1的圖中地址55600020H讀出四個字節000060B6H爲頁表項內容
虛地址低12位0010 0101 1010爲頁內偏移,根據圖13,頁表項高20位爲實頁號,因此物理地址=頁面基址*2^12+頁內偏移=00006000H+025AH=0000625AH
-
從物理地址讀出數據:EAX=061A9936H