我的ucore實驗**
完成do_pgfault(mm/vmm.c)函式,給未被對映的位址對映上物理頁。設定訪問許可權的時候需要參考頁面所在 vma 的許可權,同時需要注意對映物理頁時需要操作記憶體控制結構所指定的頁表,而不是核心的頁表。注意:在lab3 exercise 1處填寫**。執行make qemu後,如果通過check_pgfault函式的測試後,會有「check_pgfault() succeeded!」的輸出,表示練習1基本正確。
請在實驗報告中簡要說明你的設計實現過程。請回答如下問題:
請描述頁目錄項(page directory entry) 和頁表項(page table entry) 中組成部分對ucore實現頁替換演算法的潛在用處。
如果ucore的缺頁服務例程在執行過程中訪問記憶體,出現了頁訪問異常,請問硬體要做哪些事情?
我的設計實現過程
do_pgfault函式已經完成了引數檢查及錯誤檢查等流程,根據注釋不難完成剩下的流程。
檢查頁面異常發生時的錯誤碼的最低兩位,即存在位和讀/寫位,如果發現錯誤則列印相關提示資訊並返回。導致錯誤的原因有:讀沒有讀許可權的記憶體、寫沒有寫許可權的記憶體、所讀內容在記憶體中卻讀失敗等。(原**中已實現)
用虛擬位址addr索引頁目錄表和頁表,得到對應的頁表項。這時要分兩種情況討論。
如果頁表項不為0,而又出現缺頁異常,說明系統已建立虛擬位址addr到物理頁的對映,但對應物理頁已經被換出到磁碟中。這時同樣需要申請分配乙個物理頁,把換出到磁碟中的那個頁面的內容寫到該物理頁中;接下來和步驟3類似,同樣需要建立虛擬位址addr到物理頁的對映,同樣需要把該物理頁插入到可置換頁鍊錶的末尾。
問題1:頁目錄項和頁表項對頁替換演算法的用處
答:頁替換涉及到換入換出,換入時需要將某個虛擬位址vaddr對應於磁碟的一頁內容讀入到記憶體中,換出時需要將某個虛擬頁的內容寫到磁碟中的某個位置。而頁表項可以記錄該虛擬頁在磁碟中的位置,為換入換出提供磁碟位置資訊。頁目錄項則是用來索引對應的頁表。
問題2:缺頁服務例程出現頁訪問異常時,硬體需要做哪些事情
答:關中斷
根據中斷源,跳轉到缺頁服務例程
**優化
對照答案對**進行優化。
do_pgfault呼叫get_pte時沒有檢查返回值。
我的**:
pte_t *ptep = get_pte(mm->pgdir, addr, 1);
答案的**:
pte_t *ptep=null;
// try to find a pte, if pte's pt(page table) isn't existed, then create a pt.
// (notice the 3th parameter '1')
if ((ptep = get_pte(mm->pgdir, addr, 1)) == null)
do_pgfault呼叫pgdir_alloc_page和swap_in失敗後沒列印錯誤資訊以方便定位。
我的**:
if (*ptep == 0)
}else if (swap_init_ok)
}
答案的**:
if (*ptep == 0)
}else
page_insert(mm->pgdir, page, addr, perm);
page->pra_vaddr = addr;
}else
}
請在實驗報告中簡要說明你的設計實現過程。
請在實驗報告中回答如下問題:
如果要在ucore上實現"extended clock頁替換演算法",請給出你的設計方案,現有的swap_manager框架是否足以支援在ucore中實現此演算法?如果是,請給出你的設計方案。如果不是,請給出你的新的擴充套件和基此擴充套件的設計方案。並需要回答如下問題:
我的設計實現過程
為支援換入換出,在lab 2的基礎上主要修改了兩個地方:一是當虛擬頁被換出到磁碟時,用對應頁表項的高24位記錄磁碟位址;二是在page結構體中增加了pra_page_link和pra_vaddr兩個字段,前者用於將可換出的物理頁儲存在乙個鍊錶中,後者用於記錄當前物理頁對應的虛擬頁位址(由於可以換入換出,同乙個物理頁在不同時刻可能被對映到不同的虛擬頁,因此有必要增加乙個字段記錄當前對映到的虛擬頁位址)。
swap_out_victim函式根據fifo置換演算法,選擇可換出物理頁鍊錶的首元素,作為將被換出的物理頁。
回答問題(待完成)
《ucore lab1 練習4》實驗報告
首先要介紹一下 對於bootloader訪問硬碟時都是lba模式的pio方式,也就是說所有的i o操作都是通過cpu訪問硬碟的i o位址暫存器完成。作業系統位於第乙個硬碟上,而訪問第乙個硬碟的扇區可以設定i o埠0x1f0 0x1f7來改變位址暫存器實現。下述 所顯示的即為0x1f0 0x1f7所對...
《ucore lab1 練習5》實驗報告
我們需要在lab1中完成kdebug.c中函式print stackframe的實現,可以通過函式print stackframe來跟蹤函式呼叫堆疊中記錄的返回位址。如果能夠正確實現此函式,可在lab1中執行 make qemu 後,在qemu模擬器中得到類似如下的輸出 請完成實驗,看看輸出是否與上...
實驗3實驗報告
遲到的實驗3實驗報告 實驗結論 練習1 先用記事本編輯彙編源程式並儲存 然後進行編譯和鏈結得到可執行檔案 編譯和鏈結時結尾加分號可以跳過一些一般情況下預設的步驟,方便一次性生成目標檔案 執行將line4和line9中暫存器dl的值分別修改為6和8 重新彙編鏈結執行,可以發現執行的結果變成了我們所修改...