lab2實驗報告
lab2實驗報告
一、實驗思考題
Thinking2.1
虛擬地址查詢可以不經過TLB和頁表的查詢,於是不需要進行地址轉換。缺點是一個虛擬地址可能對應不同實體地址,導致cache空間的浪費,命中率降低。若cache沒有命中,則效率反而會下降。對於每個程序的虛擬空間是獨立的,而如果使用cache則需要額外區分是哪一個程序,否則可能影響程序間的獨立執行問題。
實體地址查詢更有利於資料的安全共享,不會發生上述的缺點。
Thinking2.2
虛擬地址。c
語言執行時指標均是虛擬地址。
Thinking2.3
巨集函式有
- 建立連結串列頭
- 初始化連結串列頭
- 清除連結串列
- 連結串列的
for-each
迴圈 - 從頭部插入連結串列
- 從尾部插入連結串列
- 從中間某一項的前、後插入連結串列
- 刪除元素
結構體中有下一項的地址,和上一項中指向下一項指標的地址。因為存放有上一項中指向下一項指標的地址,所以方便了插入和移除結點的操作。通過這樣巧妙的設計,有很好的抽象和可擴充套件性,在使用時可以定義連結串列結點的型別,而其他的相關操作都已經封裝好。
Thinking2.4
使用do-while
可以讓程式碼塊成為完整的一部分,相當於一句話,避免出現單句if
或其他語句中的錯誤,巨集函式展開成為整個部分。
例如
if (...) { /* something */ }; else (...) { /* something */ };
利用dev
編譯時會報錯
另外,可以使用break
增加控制。
Thinking2.5
真實的實體記憶體頁在實體記憶體當中,邏輯上我們將其分為頁來管理,但真實的實體記憶體中的記憶體是連續分佈的。
我們可以通過pmap.h
中定義的page2pa()
函式,傳入一個Page
結構體指標,即可得到實體記憶體頁的實體地址。
具體實現為物理頁框號左移12位。
指標pp相對於pages的偏移量
Thinking2.6
C
Thinking2.7
虛擬地址。在alloc()
函式中,有相關程式碼段。
if (clear) {
bzero((void *)alloced_mem, n);
}
這裡alloced_mem
freemem
相關,所以為虛擬地址。
Thinking2.8
$0xC0000000+((0xC0000000>>12)<<2) = 0xC0000000+0x00300000 = 0xcC0300000 $
起始地址:$0xC0300000$
Thinking2.9
可以有虛擬地址直接得到對應頁表項的虛擬地址。設定頁目錄可以判斷頁面是否有效,減少記憶體開銷。
Thinking2.10
在實現pgdir_walk()
中,有註釋段pgdir_walk returns a pointer to the page table entry (with permission PTE_R|PTE_V)
在這個函式中進行了關於PTE_R
許可權位的相關操作。
Thinking2.11
- 將
CP0_ENTRYHI
的值存放至k1
暫存器 - 將
CP0_ENTRYHI
的值修改為a0
暫存器的值 - 利用
tlbp
查詢,如果虛擬地址匹配,則將index
儲存到Index
暫存器中。沒有匹配,則Index
暫存器的最高位置1 - 四個
nop
用於等待tlbp
出流水線,保證mfc0
讀取到更新後的結果 - 將
CP0_INDEX
值寫入k0
暫存器 - 如果
k0
的最高位置1,即值小於0,發生缺失,跳轉到NOFOUND
處理 - 清除
CP0_ENTRY
,CP0_ENTRYLO0
,更新TLB
Thinking2.12
va2pa的實現中,低12位清零,所以頁內偏移並沒有被考慮進來,只是獲得了va對應實體記憶體頁的首地址,所以改變va的值時,並不改變pa的值。
Thinking2.13
一級頁表中多增加一位標記位,由於一級頁表的一項對映到4MB的頁面地址,需要區分一級頁表中存放的是二級頁表的入口地址還是4MB大物理頁面地址。
二、實驗難點圖示
主要難點在於理解記憶體,並且掌握虛擬記憶體的管理。並且明白什麼時候用虛擬記憶體,何時該用實體記憶體。並且理解如何利用頁表來管理記憶體。
頁目錄自對映
UVPT(0x7fc00000) 到 ULIM(0x80000000) 之間的空間只有 4MB
可以通過頁表起始地址計算頁目錄的虛擬地址。
三、體會與感想
本單元主要內容是記憶體管理,首先是實體記憶體,在此基礎之上需要掌握虛擬記憶體。直接訪問記憶體有很多不便之處,而通過虛擬記憶體的方法,可以將不同地址空間獨立出來,程式設計師可以只關注於邏輯地址而不用從頭考慮實體記憶體的規劃。
通過學習,完善建立記憶體管理相關的作業部分,總體來說這次作業是需要花費大量時間來學習的, 需要理解整個的頁表機制,以及如何通過每一步的函式來實現複雜功能。以及對於相關指標的運用自己掌握地還不夠熟練。
隨著實驗的進行,作業系統也在不斷完善,後續的任務也不會太輕鬆,需要好好加油。