MIT-JOS系列1:实模式和保护模式下的段寻址方式
?
實模式下的段尋址
以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位的保護模式基地址不需要左移不一樣
保護模式下的段尋址
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表中找到段描述符的段基址,然后偏移
保護模式下的地址形成
- 索引*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],求:
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存放的是線性地址!我目前還沒搞懂。。
(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
?
轉載于:https://www.cnblogs.com/sssaltyfish/p/10656781.html
總結
以上是生活随笔為你收集整理的MIT-JOS系列1:实模式和保护模式下的段寻址方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql索引及sql执行顺序
- 下一篇: Elasticsearch之如何合理分配