x86保護模式下的內存分段的地址映射

閱讀此文,先熟悉x86體系早期的實模式下的內存分段的地址映射

正是由於在實模式下直接對物理內存進行讀寫,非常不安全,所以誕生了新的內存分段的映射方式,其目的就是對物理內存進行保護,而對內存進行保護需要注意的是一下三點:
1.內存的起始地址。
2.內存的長度。
3.內存的權限信息。

此時CPU的架構已經來到了32位,尋址能力達到了2^32=4G。此前的分段地址映射的模式已經不再適用,但是Intel x86的CPU爲了能夠保證整個體系向前兼容的能力,所以它並不能刪除80386之前已有的CPU內部寄存器,如段寄存器CS,DS,SS。它的解決辦法是對已有的段寄存器做出新的定義。

保護模式下內存分段的地址映射的模式:段描述符+段表
其中段表是由段表項組成的,那麼有多少個段表項?,段表項具體描述了什麼信息?,每個段表項有多大字節?,段表的起始地址在哪裏存放?,帶着這些個問題,接下來一一分析。

(1)對段寄存器的重新定義,即段描述符:
在這裏插入圖片描述
從上圖可以看到段表的下標的最大值爲2^13=8192個,但是由於Linux內核使用了12個,那麼剩餘了8180個段表項可以被使用。
在這裏插入圖片描述

(2)因爲8086中的段寄存器已經被重新定義,所以80386擴充了新的寄存器LDTR,GDTR寄存器,用於存放段表的起始地址。

(3)段表項是如何定義的?接下來看段表項描述符:
在這裏插入圖片描述
可以看到段表項大小爲64位,即8字節大小。其中地址信息佔用32位,描述段長度信息佔用20,2^20=1M,但是具體能夠描述多大的段,它的單位是由G位來決定的,G=0表示描述的單位是字節,即描述段大小位1MB。G=1表述描述的單位是一個頁面4KB,此時1M*4KB=4GB,剛剛是32位下整個尋址空間大小。

x86保護模式下內存分段和內存分頁的地址映射的工作流程:

1.通過段寄存右移三位,獲得在段表中的下標。
2.根據段寄存的TI判斷使用GTRD或LDTR。
3.從LDTR或GTRD中拿到段描述符表的起始地址。
4.如TI=0使用GDT, GDTR[CS>>3].BaseAddress + IP(需要與length做比較,方式越界) = 線性地址,由於此處沒有分頁的機制,線性地址就是物理地址。可以直接進行訪問了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章