邏輯位址,線性位址,實體地址。 邏輯位址是程式中直接用到的位址,是由乙個16位的段選擇符和乙個32位的偏移量構成,**中的變數的位址儲存的實際是邏輯位址的偏移部分,也就是說這個段選擇符其實是存在於邏輯位址的高多少位的,這個對於程式來說是可見的。
線性位址和實體地址,這裡和分頁機制開啟是否有關,若開啟則必須要將邏輯位址轉換成線性位址再轉換到實體地址,若未開啟,則線性位址=實體地址。
分段機制:由四部分構成,邏輯位址,段選擇符,段描述符,段描述符表。 cpu通過邏輯位址中的段選擇符去索引段描述表然後找到段描述符,若以上都合法,則根據段描述符的基位址將邏輯位址轉換成線性位址。
那麼段選擇符是如何獲得的呢?都知道這個選擇符是存在於**中的,那麼為了使cpu能快速的獲得段選擇符,x86提供了6個段暫存器,這個用來存放當前程式的各個段的選擇符。
段描述符呢,這個是用來描述乙個段的,包括多大,基位址,等等。當查詢到段描述符後,首先會檢查合法性,然後會將其中的32位基位址和邏輯位址中的32位偏移量相加得到線性位址。
段描述符表,段選擇符去索引段描述是通過這個段描述符表來查詢的,分為兩種個,gdt,ldt。位了加速對gdt和ldt的訪問,x86提供了gdtr和ldtr的暫存器。程式可以使用lgdt和sgdt來對gdtr進行讀取或儲存,一般來說gdtr暫存器一般不會太大變化,而ldtr在每個程序切換的時候對會被替換成ldt的段描述符。
來個邏輯位址轉換成線性位址的總結:
1,程式載入;
2,通過程序的ldt的段選擇符索引gdt,獲得ldt的段描述符,被載入到ldtr暫存器。
4,從ds對應的段描述符暫存器獲得段的基位址,然後和偏移量相加,得到線性位址。
總之,就是先找到通過ldtr 來找到ldt,然後通過cs ds 去查詢到ldt,最後重新更新cs ds,然後根據更新的資訊+偏移量獲得線性位址。
分頁機制:
其核心思想就是通過頁表將線性位址轉換成實體地址,並配合旁路的緩衝區tlb來加速轉換過程,通過cr0的pg位置1來開啟。
由三部分組成:頁表,cr3暫存器,tlb。
開始說到分段機制找到了線性位址,那麼開啟分頁機制之後的線性位址是什麼呢,他由三部分組成,頁目錄,頁表,偏移。
所以我們是通過目錄找到頁目錄項,然後表找到頁表項,最後和偏移量做加法。
然後一步一步分析: cpu要索引頁目錄,必須先找到頁目錄的實體地址,而這個是存放在cr3暫存器中的。 然後找到了頁目錄,然後再找到頁表項,最後和偏移位址做疊加。
其中,找頁表項的時候,在頁表項中有個p欄位,而這個欄位使虛擬記憶體成為可能。p=1,物理頁面存在於物理記憶體中,可以直接訪問該頁面;p=0,頁面不在物理記憶體中,訪問的時候會產生乙個缺頁中斷,然後交由作業系統去處理。
tlb能將最近用到的頁面進行快取, 這裡可以看出,快取的也只是頁面,而不是具體的實體地址,最後還得和線性位址進行疊加,得到實體地址。
而如何更新tlb呢,兩種辦法:更新cr3,導致tlb整體被重新整理;invlpg指令,對單獨的頁面進行重新整理。
再來一次總結:
首先cpu訪問乙個線性位址,若存在於tlb中,則和偏移量相加得到實體地址。
若不存在呢,則需要查詢頁目錄項,然後查詢頁表,最後和偏移位址相加,並且把對映插入到tlb中。
作業系統總結(九)虛擬記憶體
利用虛擬記憶體,可以編寫大於實際記憶體的程式 採用部分程式載入到記憶體中,可以同時執行更多的程序,併發度好,效率高。將需要的部分放入記憶體,有些用不到的部分從來不放入記憶體,記憶體利用率高 程式開始執行 響應時間等更快。使用虛擬記憶體有利於系統,同時也有利於使用者。虛擬記憶體的實現 早期 記憶體不足...
作業系統 虛擬記憶體
1.虛擬記憶體術語 虛擬記憶體 程式引用記憶體使用位址與記憶體系統用於識別物理儲存站點的位址是不同的,程式生成的位址會自動轉換成機器指令。虛擬記憶體的大小收到定址機制和可用的備用記憶體量的限制,而不受記憶體儲存位置實際數量的限制。虛擬位址 在虛擬記憶體中分配給某一位置的位址使該位置可以被訪問,彷彿它...
作業系統虛擬記憶體
虛擬記憶體是計算機作業系統提供的一種記憶體管理技術,它使得應用程式認為它擁有連續可用的記憶體 乙個連續完整的位址空間 而實際上,它通常是被分隔成多個物理記憶體碎片,還有部分暫時儲存在外部磁碟儲存器上,在需要時進行資料交換。與沒有使用虛擬記憶體技術的系統相比,使用這種技術的系統使得大型程式的編寫變得更...