內(nèi)存管理實驗_第1頁
內(nèi)存管理實驗_第2頁
內(nèi)存管理實驗_第3頁
內(nèi)存管理實驗_第4頁
內(nèi)存管理實驗_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、實驗二 缺頁次數(shù)統(tǒng)計n實驗?zāi)康?.了解內(nèi)存管理方法。2.記錄進(jìn)程缺頁中斷次數(shù)。Linux分段和分頁在x86CPU中,分段機制是實現(xiàn)虛擬主存的基本單位。在保護(hù)模式下,通過硬件地址主存管理單元(Memory Management Unit ,MMU)將虛擬地址轉(zhuǎn)換為物理地址 。分頁機制在分段機制之后工作,以完成從線性地址到物理地址的轉(zhuǎn)換。 Linux頁面管理n在Linux中,主存的分配與管理以頁框為單位,一個頁框的大小為4KB。n內(nèi)核需要對每個頁框的狀態(tài)進(jìn)行管理,為每個頁框分配一個struct page,該結(jié)構(gòu)記錄頁框的使用狀態(tài)。 n使用bitmap對頁框進(jìn)行管理。共11個 。第0組的每一個表示單

2、個頁框的使用情況,為1表示該頁框正在使用,為0表示空閑;第1組的每一位表示相鄰的兩個頁框的使用情況,如果其中有一個位置1,表示對應(yīng)的兩個頁框正在使用,以此類推;第i組中的每一位表示相鄰的2i個頁框被使用的情況。 Linux頁面換出 nkswapd()利用兩個控制變量free_pages_high和free_pages_low進(jìn)行判斷。如果空閑頁框數(shù)小于free_pages_high,就要有頁面被交換出去;如果空閑頁框數(shù)小于free_pages_low,kswapd()不僅換出部分頁面,還要把睡眠時間減為平時的一半,更頻繁地?fù)Q出頁面;當(dāng)空閑頁框數(shù)大于free_pages_low時,睡眠時間又會恢

3、復(fù)原樣。 Linux頁表 n所以頁目錄項和頁表一共只需要20位,占用物理地址的1231位,還有12位用作標(biāo)志位,可以用于控制或其他目的 。n存在位:表明項對應(yīng)的物理頁是否加載到主存。n讀/寫位:表明該頁是只讀還是可寫,起保護(hù)作用。n用戶/系統(tǒng)位:選擇用戶級訪問許可或內(nèi)核級訪問許可。n訪問位:表明該頁是否被訪問過。n臟標(biāo)志位:表明該頁是否被寫過。n直寫位:置位表明頁面cache采用“直寫”(既寫主存也寫緩存),否則回寫緩存。 Linux地址n頁目錄表項,置于高10位,存放頁目錄的索引;頁表項,占據(jù)中間10位,存放頁表的索引;偏移量,占據(jù)低12位,表示在4KB的頁框中的偏移量。 n頁目錄用一個物理

4、頁框存儲,用來保存頁表的基址。每個數(shù)據(jù)項占4B,因而頁目錄表有1024個數(shù)據(jù)項。 n頁表也使用一個物理頁框存儲,用來保存物理頁框號。每個數(shù)據(jù)項占4B因而頁表也有1024個數(shù)據(jù)項。 Linux進(jìn)程虛存區(qū)映射 n在Linux內(nèi)核中,創(chuàng)建并初始化一個虛存區(qū)映像是由被稱為主存映射的函數(shù)mmap()來完成的 。nMMU進(jìn)行虛實地址轉(zhuǎn)換時會產(chǎn)生缺頁異常,然后系統(tǒng)通過異常調(diào)用執(zhí)行do_page_fault()函數(shù)來完成可執(zhí)行文件的剩余頁面。 統(tǒng)計系統(tǒng)和單個進(jìn)程的缺頁次數(shù) n先需要添加一個全局變量global_pf作為計數(shù)變量,將該變量申明在usr/src/kernels/linux 2.6.18/ incl

5、ude/linux/mm.h文件中:extern unsigned long volatile global_pf;n在arch/i386/mm/fault.c中定義該變量:unsigned long volatile global_pf=0;注:.h文件用“文本編輯器”打開方法:右鍵點擊文件,選擇“使用其它程序打開”,在“使用自定義命令”中鍵入gedit,點擊“打開”。n在定義好之后,修改arch/i386/mm/fault.c中的do_page_fault(),global_pf在該函數(shù)的開始時自增:fastcall void _kprobes do_page_fault(struct p

6、t_regs*regs,unsigned long error_code) tsk = current;在tsk = current; 后添加global_pf+;n要記錄進(jìn)程的缺頁次數(shù),首先要在進(jìn)程的進(jìn)程控制塊中添加一個成員pf。進(jìn)程控制塊task_struct定義在文件include/Linux/Sched.h中;Struct task_structunsigned long pf;n修改arch/i386/mm/fault.c中的do_page_fault()函數(shù),當(dāng)前進(jìn)程的pf在該函數(shù)開始時自增:fastcall void_kprobes do_page_fault(struct pt

7、_regs*regs, unsigned long error_code) tsk = current; global_pf+;在上次添加的global_pf+;后添加current-pf+;nkernelfork.c文件中的dup_task_struct函數(shù),修改該函數(shù)進(jìn)程的pf設(shè)置成0:Static struct task_struct*dup_task_struct(struct task_struct*orig) *tsk=*orig; 在*tsk=*orig;后添加tsk-pf=0;n添加系統(tǒng)調(diào)用。在linux-2.6.18/kernel/sys.c文件的最后添加以下內(nèi)容。asmli

8、nkage long sys_global_pf()return global_pf;asmlinkage long sys_pf()return current-pf;系統(tǒng)調(diào)用設(shè)計n在linux-2.6.18/include/asm-i386/unistd.h中 #define _NR_move_pages 317后定義調(diào)用號: #define _NR_global_pf 318 #define _NR_pf 319n在linux-2.6.18/arch/i386/kernel/ syscall_table.S的最后添加: .long sys_global_pf .long sys_pf重新編譯內(nèi)核。寫測試代碼#include #include int main()long gpf=syscall(318);long cpf=syscall(319);printf(%dn,gp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論