我們知道,在linux作業系統中,cpu在執行乙個程序的時候,都會訪問記憶體。
但cpu並不是直接訪問物理記憶體位址,而是通過虛擬位址空間來間接的訪問物理記憶體位址。
所謂的虛擬位址空間,是作業系統為每乙個正在執行的程序分配的乙個邏輯位址,在32位機上,其範圍從0 ~ 4g-1。作業系統通過將虛擬位址空間和物理記憶體位址之間建立對映關係,讓cpu間接的訪問物理記憶體位址。
通常將虛擬位址空間以512byte ~ 8k,作為乙個單位,稱為頁,並從0開始依次對每乙個頁編號。這個大小通常被稱為頁面
將實體地址按照同樣的大小,作為乙個單位,稱為框或者塊,也從0開始依次對每乙個框編號。
作業系統通過維護一張表,這張表上記錄了每一對頁和框的對映關係。如圖:
注意,每個程序都有頁表,頁表起始位址和頁表長度的資訊在程序不被cpu執行的時候,存放在其pcb內。
按照上述的過程,可以發現,cpu對記憶體的一次訪問動作需要訪問兩次物理記憶體才能達到目的,第一次,拿到框的起始位址,第二次,訪問最終實體地址。cpu的效率變成了50%。為了提高cpu對記憶體的訪問效率,在cpu第一次訪問記憶體之前,加了乙個快速緩衝區暫存器,它裡面存放了近期訪問過的頁表項。當cpu發起一次訪問時,先到tlb中查詢是否存在對應的頁表項,如果有就直接返回了。整個過程只需要訪問一次記憶體。如圖:
這種方式極大的提高了cpu對記憶體的訪問效率。將近90%。
然而這樣的方式還是存在弊端,在物理記憶體中需要拿出至少1m的連續的記憶體空間來存放頁表。可以通過多級頁表的方式,將頁表分為多個部分,分別存放,這樣就不要求連續的整段記憶體,只需要多個連續的小段記憶體即可。
把連續的頁表拆分成多個頁表稱之為一級頁表,再建立一張頁表,這張頁表記錄每一張一級頁表的起始位址並按照順序為其填寫頁表號。
通過這樣的方式,cpu從基位址暫存器中拿到了一級頁表的位址,從位址結構中取出一級頁表的頁表號,找到二級頁表的起始實體地址;然後結合位址結構中的中間10位(二級頁表上的頁表號),可以找到對應的框的起始位址,最後結合頁內偏移量,就可以計算出最終目標的實體地址。如圖:
linux 頁 頁表 頁框 塊
基本介紹 我們知道,在linux作業系統中,cpu在執行乙個程序的時候,都會訪問記憶體。但cpu並不是直接訪問物理記憶體位址,而是通過虛擬位址空間來間接的訪問物理記憶體位址。所謂的虛擬位址空間,是作業系統為每乙個正在執行的程序分配的乙個邏輯位址,在32位機上,其範圍從0 4g 1。作業系統通過將虛擬...
linux 頁 頁表 頁框 塊
我們知道,在linux作業系統中,cpu在執行乙個程序的時候,都會訪問記憶體。但cpu並不是直接訪問物理記憶體位址,而是通過虛擬位址空間來間接的訪問物理記憶體位址。所謂的虛擬位址空間,是作業系統為每乙個正在執行的程序分配的乙個邏輯位址,在32位機上,其範圍從0 4g 1。作業系統通過將虛擬位址空間和...
頁 頁表 頁表項
作業系統和計算機組成原理裡都講到記憶體管理的頁式管理,但是本人以及很多初次學習分頁的時候,都會迷茫頁表大小和頁表項大小之間的關係,本人仔細分析了後寫了這篇blog,僅當學習交流,個人理解之用,如果有錯或者分析不夠嚴謹,歡迎指正。按字 圖結合起來分析,相信還是比較容易看懂。號單元開始編址,稱之為目標模...