作業系統之哲學思想之記憶體原理

2022-03-11 11:36:41 字數 3261 閱讀 7946

一、基本記憶體

1.1、記憶體管理:是對記憶體架構進行管理,使程式在記憶體架構的任何乙個層次上的存放對於使用者來說都是一樣的。

記憶體管理實現這種媒介透明的手段就是虛擬記憶體

1.2、記憶體管理要達到什麼目的?

1.3、虛擬記憶體

中心思想:將物理主存擴大到便宜、大容量的磁碟上,即將磁碟空間看作是主存空間的一部分。

虛擬記憶體要提供的就是乙個空間像磁碟那樣大、速度像快取那樣高的主儲存系統,而對程式位址所在的位置(快取、主存、磁碟)的判斷則是記憶體管理系統的乙個中心功能。

1.4、記憶體管理方法 

多道程式設計的記憶體管理-------實現機制:基址與極限

1.5、交換

交換:將乙個程序從記憶體倒出到磁碟上,再將其從磁碟上載入到記憶體中來的過程。

目的:二、頁式記憶體管理

空間碎片化的根源是每個程式的大小不一樣,這樣在空間分配時不存在一致性。

分頁系統的核心是頁面的翻譯,即從虛擬頁面到物理頁面的對映。這個翻譯過程由記憶體管理單元(mmu)完成

mmu對虛擬位址的翻譯只是對頁面號的翻譯,即將虛擬頁面號翻譯成物理頁面號。而對偏移值,則不進行任何操作(虛擬頁面裡的偏移值和物理頁面裡的偏移值完全一樣,無需翻譯)

e.g   對於32位定址的系統,如果頁面大小位4kb,則頁面號佔20位,頁內偏移值佔12位

2^12=4k=4x1024 即頁內偏移值12位

2.2、頁表

mmu是通過頁表知道該頁面是否有效、是否被保護、是否在物理記憶體。

mmu是如何將虛擬位址轉化為實體地址呢,它會去查詢頁表。mmu將虛擬位址轉換為實體地址,不是按乙個乙個位址轉換的,是以4k一頁為單位轉換的。

對於每乙個程式,mmu都為其儲存乙個頁表,該錶裡面存放的是虛擬頁面到物理頁面的對映

mmu中有幾個概念:

pte:頁表項,即某條具體的轉換規則,例如0x84050000這一頁對映到0x8000物理頁。

tlb:翻譯快表---mmu中的cache,用來快取最近用過的pte(tlb裡面存放的是從虛擬頁面到物理頁面的對映,其記錄的格式與內容和正常頁表的記錄格式與內容一樣)

頁表的乙個記錄所包括的內容大致為如圖所示:

注:訪問位和修改位是mmu進行頁面置換時依賴的資訊

從上面可以看出,因為各個程序對映不同,每個程序必須有獨立的頁表。系統中如果有100個程序,則需要4*100=400m記憶體來儲存頁表,這是不行的。那麼能不能不對映一些頁呢? 不行,4g的空間哪些不用是未知的,所以必須提前都預留對映。

假如乙個程序需要使用100m的記憶體,那麼1m個頁表項中只有25k個是有用的,使用率百分之二,剩下的3.98m頁表記憶體都浪費掉了。

想要節省頁表記憶體,就不能以4k為單位對映,要以4m為單位對映,頁表只需要1k個,占用4k記憶體。每乙個頁表項指向4m的位址,需要第二級頁表,第二級頁表按照4k為單位對映的話,每個4m需要1k個頁表項,占用4k記憶體。再算算上述乙個程序需要100m記憶體,首先一級頁表是4k,二級頁表只需要25張*4k,全部頁表只占用104k記憶體,相比4m節省了大部分記憶體,僅浪費了3.99k的記憶體。

可以看到,使用多級頁表,不僅節省每個程序的頁表占用的記憶體,還能根據程序使用記憶體不同動態的調整頁表占用記憶體的大小。

事實上,在arm架構中,這個訪問過程是硬體實現的,但是頁表的填充是軟體維護的

2.4、缺頁中斷處理

缺頁中斷程式是如何知道虛擬頁面在磁碟的什麼地方呢?

它不知道,但它知道產生缺頁中斷程序所對應的源程式檔名和產生缺頁中斷的虛擬位址。

這樣,缺頁中斷服務程式首先根據虛擬位址計算出該位址在相應程式檔案裡面的位移量或偏移量(offset),

然後要求檔案系統在這個偏移量的地方進行檔案操作

當一旦執該**段時,由於頁表項不存在,cpu會產生一次違例訪存,跳進os早早就調置好的缺頁異常**(do_page_fault),在do_page_fault函式內經過嚴密的安檢之後,確認程式訪存的合法性之後,就要將檔案載入到記憶體中。

接著:do_page_fault根據vma裡面描述的檔名,呼叫文系統介面將檔案記憶體載入到物理記憶體中。等等……這個過程也涉及很複雜的載入過程,涉及磁碟訪問,bio,以及pagecache,可以在知乎上找很多相關的描述。

最後:檔案載入到物理記憶體(就是pagecache)後,可以修改頁表項了,將頁有的pfn填寫成物理記憶體的頁框號,訪問屬性等一系的頁表位寫之後,就算完了,返回使用者態。繼續執行。

缺頁中斷的處理步驟:

如何把頁面鎖在記憶體裡面呢?

只需要對該頁面作出特殊標記,即在頁表的相應記錄項裡增加一項標誌。如果該標誌被設定,缺頁中斷服務程式在選擇被替換的頁面時將跳過該頁面。

三、段式記憶體管理

3.1、分段管理系統

分段情況下,乙個虛擬位址將由段號和段內偏差兩部分構成

分段管理的實現手段是:需要一組基址與極限對,而每一對基址極限用於其中一段的管理。

分段管理的乙個重要資料結構就是段表,由於段的數量少,通常為3~5段。

3.2、段頁式記憶體管理

由段號在段表裡面獲得所應使用的頁表,然後在該頁表裡面查詢物理頁號

multics 段頁式管理系統的段表記錄包含的內容:

是否分頁:該標誌用來表明該系統是否分頁;0標識分頁,1標識部分頁。如果不分頁,那就是純邏輯分段

3.3、段號是否占用定址字位

在分段模式下,一條指令的虛擬位址包括段號和段內偏差。那麼段號將不占用虛位址空間的字段

段號不佔虛位址空間位數是如何實現的呢?

使用單獨的暫存器來存放段號,或者將段號隱含在指令操作碼裡,即每條指令都隱含了自己到底屬於哪乙個邏輯段

作業系統原理之記憶體 一

在彙編指令中,我們有時會看到如下指令 text entry 入口 call 40 main 那麼這裡的40指向的是記憶體中的哪個位置呢?是記憶體的實際位址嗎?顯然,如果是實際位址的話我們的程式必須被裝載在記憶體0位址處,但這樣做肯定是存在問題的,一方面,如果這樣的話每個程式都要放到0位址處 另一方面...

作業系統原理之記憶體 一

在彙編指令中,我們有時會看到如下指令 text entry 入口 call 40 main 那麼這裡的40指向的是記憶體中的哪個位置呢?是記憶體的實際位址嗎?顯然,如果是實際位址的話我們的程式必須被裝載在記憶體0位址處,但這樣做肯定是存在問題的,一方面,如果這樣的話每個程式都要放到0位址處 另一方面...

作業系統之哲學原理 程序

作業系統之哲學原理 程序 程序管理,記憶體管理和檔案管理是作業系統的三大核心功能。乙個程式載入到記憶體後就變為程序 程序 程式 執行,為了提高cpu利用率,人們想起將多個程式載入到計算機裡,併發執行。程序讓讓每個使用者感覺到自己獨佔cpu。程序模型 從物理記憶體的分配來看,每個程序占用一片記憶體空間...