日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 核心--4.內(nèi)存管理( 二 )



為了將虛擬地址轉(zhuǎn)換為物理地址,處理器首先必須得到虛擬地址頁面框號及頁內(nèi)偏移 。一般將頁面大小設(shè)為2的次冪 。將圖3.1中的頁面大小設(shè)為0x2000字節(jié)(十進制為8192)并且在進程Y的虛擬地址空間中某個地址為0x2194,則處理器將其轉(zhuǎn)換為虛擬頁面框號1及頁內(nèi)偏移0x194 。

處理器使用虛擬頁面框號為索引來訪問處理器頁表,檢索頁表入口 。如果在此位置的頁表入口有效,則處理器將從此入口中得到物理頁面框號 。如果此入口無效,則意味著處理器存取的是虛擬內(nèi)存中一個不存在的區(qū)域 。在這種情況下,處理器是不能進行地址轉(zhuǎn)換的,它必須將控制傳遞給操作系統(tǒng)來完成這個工作 。

某個進程試圖訪問處理器無法進行有效地址轉(zhuǎn)換的虛擬地址時,處理器如何將控制傳遞到操作系統(tǒng)依賴于具體的處理器 。通常的做法是:處理器引發(fā)一個頁面失效錯而陷入操作系統(tǒng)核心,這樣操作系統(tǒng)將得到有關(guān)無效虛擬地址的信息以及發(fā)生頁面錯誤的原因 。

再以圖3.1為例,進程Y的虛擬頁面框號1被映射到系統(tǒng)物理頁面框號4,則再物理內(nèi)存中的起始位置為 0x8000(4 * 0x2000) 。加上0x194字節(jié)偏移則得到最終的物理地址0x8194 。

通過將虛擬地址映射到物理地址,虛擬內(nèi)存可以以任何順序映射到系統(tǒng)物理頁面 。例如,在圖3.1中,進程X的虛擬頁面框號0被映射到物理頁面框號1而虛擬頁面框號7被映射到物理頁面框號0,雖然后者的虛擬頁面框號要高于前者 。這樣虛擬內(nèi)存技術(shù)帶來了有趣的結(jié)果:虛擬內(nèi)存中的頁面無須在物理內(nèi)存保持特定順序 。



3.1.1 請求換頁
在物理內(nèi)存比虛擬內(nèi)存小得多的系統(tǒng)中,操作系統(tǒng)必須提高物理內(nèi)存的使用效率 。節(jié)省物理內(nèi)存的一種方法是僅加載那些正在被執(zhí)行程序使用的虛擬頁面 。比如說,某個數(shù)據(jù)庫程序可能要對某個數(shù)據(jù)庫進行查詢操作,此時并不是數(shù)據(jù)庫的所有內(nèi)容都要加載到內(nèi)存中去,而只加載那些要用的部分 。如果此數(shù)據(jù)庫查詢是一個搜索查詢而無須對數(shù)據(jù)庫進行添加記錄操作,則加載添加記錄的代碼是毫無意義的 。這種僅將要訪問的虛擬頁面載入的技術(shù)叫請求換頁 。

當(dāng)進程試圖訪問當(dāng)前不在內(nèi)存中的虛擬地址時,處理器在頁表中無法找到所引用地址的入口 。在圖3.1中,對于虛擬頁面框號2,進程X的頁表中沒有入口,這樣當(dāng)進程X試圖訪問虛擬頁面框號2內(nèi)容時,處理器不能將此地址轉(zhuǎn)換成物理地址 。這時處理器通知操作系統(tǒng)有頁面錯誤發(fā)生 。

如果發(fā)生頁面錯的虛擬地址是無效的,則表明進程在試圖訪問一個不存在的虛擬地址 。這可能是應(yīng)用程序出錯而引起的,例如它試圖對內(nèi)存進行一個隨機的寫操作 。此時操作系統(tǒng)將終止此應(yīng)用的運行以保護系統(tǒng)中其他進程不受此出錯進程的影響 。

如果出錯虛擬地址是有效的,但是它指向的頁面當(dāng)前不在內(nèi)存中,則操作系統(tǒng)必須將此頁面從磁盤映象中讀入到內(nèi)存中來 。由于訪盤時間較長,進程必須等待一段時間直到頁面被取出來 。如果系統(tǒng)中還存在其他進程,操作系統(tǒng)就會在讀取頁面過程中的等待過程中選擇其中之一來運行 。讀取回來的頁面將被放在一個空閑的物理頁面框中,同時此進程的頁表中將添加對應(yīng)此虛擬頁面框號的入口 。最后進程將從發(fā)生頁面錯誤的地方重新開始運行 。此時整個虛擬內(nèi)存訪問過程告一段落,處理器又可以繼續(xù)進行虛擬地址到物理地址轉(zhuǎn)換,而進程也得以繼續(xù)運行 。

Linux使用請求換頁將可執(zhí)行映象加載到進程的虛擬內(nèi)存中 。當(dāng)命令執(zhí)行時,可執(zhí)行的命令文件被打開,同時其內(nèi)容被映射到進程的虛擬內(nèi)存 。這些操作是通過修改描敘進程內(nèi)存映象的數(shù)據(jù)結(jié)構(gòu)來完成的,此過程稱為內(nèi)存映射 。然而只有映象的起始部分被調(diào)入物理內(nèi)存,其余部分仍然留在磁盤上 。當(dāng)映象執(zhí)行時,它會產(chǎn)生頁面錯誤,這樣Linux將決定將磁盤上哪些部分調(diào)入內(nèi)存繼續(xù)執(zhí)行 。

推薦閱讀