實驗目的
了解作業系統管理記憶體的架構、實體位址空間和邏輯位址空間的管理方式;掌握配置設定和回收實體記憶體的方法。
實驗内容與記錄
3.2 通過該節步驟,回答下述兩個問題:
(1)EOS所管理的虛拟機的實體位址大小是多少Mbyte,其用于管理實體塊使用與否的資料結構是什麼?如何表示的?
① 實體記憶體的大小為33488896 Byte,經過計算,可得EOS所管理的虛拟機的實體位址大小是約為31.9375Mbyte
② EOS使用頁框号資料庫(PEN Database)來管理所有實體頁。
③ PFN Database 其實是一個數組,數組中的元素是由一個結構體來定義的,數組的長度和實體存儲器所包含的實體頁數量是一緻的。數組中的第 N 項描述了頁框号為 N 的實體頁的狀态,并且該項還指向了具有相同狀态的另一個實體頁的頁框号,以構成連結清單。
(2)零頁在EOS中的作用是麼?
①從實體作用來看:零頁是某一實體頁的狀态,表示此頁空閑可用,已進行零初始化,每個位元組的值都是 0。
②從安全作用來看:從安全性的角度來分析,配置設定零頁更加安全。例如,一個實體頁被作業系統存儲過重要的密碼資訊後被釋放,如果沒有清零就被配置設定給使用者程式,則使用者程式就可能從這個實體頁中擷取重要的密碼資訊。
3.3 回答本節書中針對配置設定和回收實體塊所提出的問題。
(1)單步調試MiAllocateAnyPages函數的執行過程,嘗試回答下面的問題:
本次配置設定的實體頁的數量是多少?配置設定的實體頁的頁框号是多少?
① 本次配置設定的實體頁數量是1
② 配置設定的實體頁的頁框号是0x409。
實體頁是從空閑頁連結清單中配置設定的?還是從零頁連結清單中配置設定的?
① 因為零頁的數量一直為零,是以實體頁是從空閑頁連結清單中配置設定的。
哪一行語句減少了空閑頁的數量?哪一行語句将剛剛配置設定的實體頁由空閑狀态修改為忙狀态?
①減少空閑頁:
減少了空閑頁的數量語句和結果如下圖:箭頭所指
②空閑變忙:
将剛剛配置設定的實體頁由空閑狀态修改為忙狀态的語句和結果如下圖:箭頭所指
繪制MiAllocateAnyPages函數的流程圖。
(2)單步調試MiFreePages函數的執行過程,嘗試回答下面的問題:
本次釋放的實體頁的數量是多少?釋放的實體頁的頁框号是多少?釋放的實體頁是之前配置設定的實體頁嗎?
①本次釋放的實體頁的數量是1
②釋放的實體頁的頁框号是0x409
③釋放的實體頁是之前配置設定的實體頁
代碼和實體記憶體圖如下:
釋放的實體頁是被放入了空閑頁連結清單中?還是零頁連結清單中?
① MIFreePageCount的值加1,釋放的實體頁被放入了空閑頁連結清單中
代碼和實體記憶體圖如下:
繪制MiFreePages函數的流程圖
3.4 通過實驗調試,EOS的應用程式程序和系統程序的邏輯位址空間是否一樣?如果不一樣有什麼差别?
①不一樣
②EOS 中的每個程序都有一個獨立的 4G 虛拟位址空間(即 4GB 的邏輯位址空間),其中低 2G 為程序私有的使用者位址空間,高 2G 為所有程序共享的系統位址空間。)程序的使用者位址空間用于存放使用者程序的代碼、資料等。系統位址空間被 EOS 核心使用,用于存放核心的代碼、核心運作時的各種資料結構以及所有線程的核心模式等。
3.5 回答本節書中針對配置設定和回收虛拟頁所提出的問題。
(1)單步調試MmAllocateVirtualMemory函數的執行過程,嘗試回答下面的問題:
配置設定的虛拟頁的起始位址是多少?配置設定的虛拟頁的數量是多少?它們和參數BaseAddress和RegionSize初始化的值有什麼樣的關系?
① 配置設定的虛拟頁的起始位址是0xa0003000
② 配置設定的虛拟頁的數量是1
③ BaseAddress作為輸入時,初始化的值為期望保留或者送出的位址區域的起始位址
④ RegionSize作為輸入時,初始化的值為期望保留或者送出的記憶體區域的大小
配置設定虛拟頁的同時有為虛拟頁映射實際的實體頁嗎?這是由哪個參數決定的?
① 配置設定虛拟頁的同時有為虛拟頁映射實際的實體頁,由參數AllocationType決定的
配置設定的虛拟頁是在系統位址空間(高2G)還是在使用者位址空間(低2G)?這是由哪個參數決定的?
① 配置設定的虛拟頁在系統位址空間,由第四個參數SystemVirtual決定的。
參考MiReserveAddressRegion函數的定義和注釋,說明該函數的功能。
①MiReserveAddressRegion函數的功能是保留一段虛拟位址區域。
待MmAllocateVirtualMemory函數執行完畢後,在“虛拟位址描述符”視窗中檢視系統程序的虛拟位址描述符,并與圖15-5進行比較,指出剛剛配置設定的是哪個虛拟頁。
① 剛剛配置設定的是序号是655364,虛拟頁框号是655363,虛拟位址是0xa0003000的虛拟頁
(2)單步調試MmFreeVirtualMemory函數的執行過程,嘗試回答下面的問題:
本次釋放的虛拟位址是多少?釋放的虛拟頁是之前配置設定的虛拟頁嗎?
① 本次釋放的虛拟位址是0xa0003000,是之前配置設定的虛拟頁。
程序圖如下:
參考MiFindReservedAddressRegion函數、MiFreeAddressRegion函數和MiDecommitPages函數的定義和注釋,說明這些函數的功能。
①MiFindReservedAddressRegion函數:查找已保留位址區域,如果目标區域非已保留區域則傳回失敗。
② MiFreeAddressRegion函數:釋放已保留位址區域。
③ MiDecommitPages函數:釋放映射在連續虛拟頁框上的實體頁框。
待MmFreeVirtualMemory函數執行完畢後,在“虛拟位址描述符”視窗中檢視系統程序的虛拟位址描述符,并與剛剛配置設定一個虛拟頁後的圖示進行比較,指出剛剛釋放的是哪個虛拟頁。
①剛剛釋放的是0xa0003000。
程序圖如下:
3.6 完成該應用程式,截圖運作結果,并說明虛拟頁配置設定前後虛拟位址描述符的變化。
運作結果截圖
虛拟頁配置設定前(左為系統程序,右為使用者程序):
虛拟頁配置設定後(左為系統程序,右為使用者程序):
實驗思考題
嘗試在啟動一個應用程式程序前執行“pm”指令,并記錄下此時已經被占用的實體頁數量;執行“vm”指令檢視系統程序的虛拟位址描述符資訊,并記錄下系統程序已經配置設定的虛拟頁數量。啟動一個應用程式程序後,再執行“pm”指令,并記錄下此時被占用的實體頁數量;使用“vm”指令分别檢視系統程序和應用程式程序的虛拟位址描述符資訊,分别記錄下系統程序和應用程式程序已經配置設定的虛拟頁數量。結合記錄的五個資料,嘗試說明由于應用程式程序執行而增加的實體頁數量與增加的虛拟頁數量是否一緻。如果不一緻,嘗試說明原因。
① 啟動應用程式程序前執行“pm”指令,并記錄下此時已經被占用的實體頁數量為1059
②執行“vm”指令檢視系統程序的虛拟位址描述符資訊,并記錄下系統程序已經配置設定的虛拟頁數量為16
③啟動一個應用程式程序後,再執行“pm”指令,并記錄下此時被占用的實體頁數量是1061
④使用“vm”指令分别檢視系統程序和應用程式程序的虛拟位址描述符資訊,分别記錄下系統程序和應用程式程序已經配置設定的虛拟頁數量
系統程序已經配置設定的虛拟頁數量:16
應用程式程序已經配置設定的虛拟頁數量:13
綜合上述圖示和資料可知,由于應用程式程序執行而增加的實體頁數量與增加的虛拟頁數量并不一緻
理由如下:
實體記憶體是有限的,而且在32位位址線的情況下最大隻能使用4GB實體記憶體,系統不可能為每個程序的4G虛拟位址空間全都映射實體頁,它們之間不是一一對應的關系。一般來說,程序虛拟位址空間對實體頁的映射是稀疏的。