摘 要:Windows內核中的物理頁面管理是內存管理的一個很重要的部分,本文首先介紹了PTE和工作集與物理頁面管理相關的部分,然后詳細介紹了物理頁面的各種狀態及轉移,并在此基礎上說明了Windows內核是如何使用PFN對物理頁面進行管理的。
關鍵詞:工作集;PTE;物理內存管理
中圖分類號:TP311.52 文獻標識碼:A 文章編號:1674-7712 (2014) 16-0000-01
我們知道,對于內存的訪問,早晚要涉及到對物理內存的操作。如果撇開虛擬內存,MMU等復雜的保護模式管理機制,一個內存,擺在你的面前,如何對其進行管理呢?首先需要明確一點的是,這里所指的物理頁面都是在物理內存中的,因為物理頁面管理部分就是要管理物理頁面的。
一、PTE和工作集
說起工作集,要從操作系統的換頁機制說起,所謂的換頁,指的是在操作系統的內存管理中,當物理內存緊張時,將某些不常使用的物理頁面轉存到硬盤的頁面文件中,從而釋放這些物理內存,當需要時,比如該頁面中的內容被引用時,再將該頁面的內容重新導入物理內存,并更改PTE中的內容,映射該頁面。因此,一個進程地址空間使用的地址,其背后對應的物理內存可以分為兩種:在物理內存中的和不在物理內存中的。我們將在物理內存中的這部分屬于某個進程的頁面稱為進程工作集,工作集分為系統工作集,會話工作集和進程工作集,系統工作集指的是系統(System)進程地址空間里使用的物理頁面,其包括系統緩存、可換頁的操作系統代碼、以及可換頁的驅動程序代碼,會話工作集指的是一個會話所包含的代碼和數據區,而進程工作集則專指某個進程的工作集。工作集的任務就是管理需要換入換出的頁面,記錄它們的情況,而那些從進入內存那刻開始就沒有挪動地方的物理頁面,是不需要浪費很多資源去管理的。因此我們可以這樣認為,由于換頁機制的存在,頁面的換入換出成為了常態(對于可換頁內存池),那么如何管理這些在內存池中不斷變化的頁面,正是工作集的任務所在。
對于進程工作集管理器,其任務在于管理一個進程空間中在內存中的物理頁面,具體功能可以分為兩個方面。(1)當物理內存緊張時,將一些不常用的內存倒到頁面文件中;(2)當頁面錯誤,系統將頁面文件中對應的內容導入內存后,工作集管理器負責將這些頁面加入到自己的鏈表中,管理這些頁面。
二、物理頁面的狀態和轉移
每個頁面的狀態可以分為:活動狀態、備用狀態、轉移狀態、已修改狀態、已修改但不寫出狀態、空閑狀態、零化狀態、壞狀態。PFN數據庫中的項與物理頁面一一對應。
活動狀態指的是該頁面在某一個工作集中,或者不在一個工作集中(如在非換頁內存池中)但是有一個有效的PTE指向該頁面。當一個頁面退出活動狀態時,會進入備用狀態、已修改狀態或者已修改但不寫出狀態,區別在于這個頁面有沒有被修改過以及修改后是否寫出到外部磁盤中,如果這個頁面沒有被修改過,那么將這個頁面置為備用狀態,此時指向該頁面的PTE被置為無效,如果該頁面修改過并且需要寫入外部磁盤,那么將該頁面置為已修改狀態,當然寫入的時機并不是馬上寫入,而是需要接受修改頁面寫出器或者映射頁面寫出器調度的。還有一種情況是該頁面被修改過,但是需不需要寫入以及何時寫入外部磁盤需要進一步明確,那么將該頁面置為已修改但不寫出狀態,這種情況一個典型的例子如在文件系統中,當使用緩沖方式修改元文件時,需要先完成日志的記錄,再將修改的內容寫入磁盤,換句話說,在完成日志記錄前,需要這個已修改但不寫出狀態。當然已修改狀態、已修改但不寫出狀態頁面對應的PTE也是無效狀態。
物理內存幀PFN:PFN(Page Frame Number)頁幀編號,每一項是24個字節,依據頁面狀態的不同而不同。一個頁面(4K)只需要完成其記錄數據的任務即可,最關鍵的結構在于對這些頁面的管理,這里每個PFN項就對應著一個頁面。PFN數據庫中的內容與物理頁面狀態一一對應。
每種狀態的頁面其對應的PFN中的內容也并不完全相同,當物理頁面處于活動狀態、備用狀態/已修改狀態、空閑狀態/零化狀態、轉移狀態幾種典型狀態下PFN中的內容。其中反顯部分為共有部分,包括PTE地址,標志,類型,引用計數,原始PTE內容,PTE的PFN。其中“PTE地址”字段指明的是指向該物理頁面的PTE的虛擬地址,這樣當我們得到一個物理頁面時,通過“PTE地址”字段可以快速的定位指向該物理頁面的PTE,并且由此PTE可以計算得到該物理頁面映射在進程地址空間中的虛擬地址。“標志”字段用于記錄該物理頁面的一些標識信息,如是否處于讀寫操作中,指向這個頁面的是否是一個原型PTE,以及標識非換頁內存池開始和結束的標識位。“類型”字段說明的是該頁面屬于前一節提到的哪種狀態中。“原始PTE內容”字段記錄了指向該物理頁面的PTE中的原始內容,就是當該物理頁面被分配到對應PTE指向前,該PTE中的內容。這樣做的目的在于當該頁面不在物理內存中時,利用這個字段可以直接填充指向它的PTE,恢復原來的PTE.“PTE的PFN”字段記錄了指向該頁面的PTE所在的頁表頁面的PFN,其意義在于可以快速定位在虛擬地址上與該頁面相鄰的頁面,因為其PTE都在一個頁表頁面中。
備用狀態或已修改狀態頁面特殊的字段是“前向鏈接”和“后向鏈接”兩個指針,因為備用狀態和已修改狀態的頁面分別構成雙向鏈表進行管理,這兩個字段分別用于前向指針和后向指針。
空閑狀態或零化狀態頁面特殊的字段是“前向鏈接”和“顏色鏈PFN號”,第一個字段是因為這兩種狀態的頁面分別構成單向鏈表,該字段用于鏈表鏈接,“顏色鏈PFN號”字段用于物理頁面在CPU高速緩存中的管理。
三、結束語
本文首先對工作集的概念進行了說明,然后介紹了物理頁面的各種狀態及轉移,最后論述了windows是如何利用PFN對物理內存頁面的管理的,其難點在于物理頁面各種狀態的理解,以及PFN結構的設計。
參考文獻:
[1]潘愛明.Windows內核原理與實現[M].北京:電子工業出版社,2013.
[2]譚文,邵堅磊.天書夜讀:從匯編語言到window內核編程[M].北京:電子工業出版社,2008.
作者簡介:楊陽(1976.02-),男,2012年畢業于中國石油大學(北京)計算機科學與技術專業,本科,現就職于中航工業黎明數據中心信息系統管理處,助理工程師,主要從事服務器、數據庫運行于維護,研究方向:Windows內核、FLASH腳本開發。