LAB2好難啊啊啊啊啊啊啊!!
- 其實我對整個LAB2的很多細節至今還沒有弄明白,下面的內容如有大面積錯誤屬正常現象,如有發現,請聯繫博主退貨。╯﹏╰
- 虛擬地址映射關係:虛擬=物理+0xC0000000
- 目前內核大小限制在4M!【實際上3M】
- 關於練習2:
pde_t *pdep = &pgdir[PDX(la)];
return &((pte_t *)KADDR(PDE_ADDR(*pdep)))[PTX(la)];
la:線性地址/物理地址
PDX(la):一級頁目錄表的下標
*pdep:la所在的二級頁表的物理地址
PDE_ADDR(*pdep):進行4K對齊【截斷低12位】
KADDR()對la所在的二級頁表的物理地址進行虛擬化【段的映射,大概就是進行地址偏移,+base】
最終得la所在二級頁表對應項的入口虛擬地址【?】 - 頁表項中存放的是線性地址
- 關於練習2:
C++
pde_t *pdep = &pgdir[PDX(la)];
if (!(*pdep & PTE_P)) {
struct Page *page;
if (!create || (page = alloc_page()) == NULL) {
return NULL;
}
set_page_ref(page, 1);
uintptr_t pa = page2pa(page);// page to physicall address,取得分配的頁的物理地址
memset(KADDR(pa), 0, PGSIZE);// 虛擬化
*pdep = pa | PTE_U | PTE_W | PTE_P;//填充頁表項信息。
}
return &((pte_t *)KADDR(PDE_ADDR(*pdep)))[PTX(la)];
- 練習一中說到要重新實現default_pmm_xx()系列的函數,提供的參考實現不完全正確。但是我參照過答案和參考兩個版本,就編寫的便捷性,優雅度,性能來說都是提供的參考版本要好orz【這裏很有可能是我沒有找到參考版本的BUG】參考版本的鏈表結點只有連續空閒頁的第一項,但是答案版本好像把所有頁作爲結點連起來了,完全不是一個次元的操作量啊,,,難道是有我沒有看出來的BUG????!!!
- 說實話其實練習不至於很難,基本上在翻譯註釋,難就難在你需要大量的閱讀他提供的宏和函數,理解整個內存管理,尤其是段頁式的具體實現,代碼的具體實現比想象中的要複雜,跟配套宏和函數的熟悉程度有關。雖然說lab2是很勉強的完成了但是感覺沒弄懂的地方還是太多了,後面的lab3是虛擬內存,想必跟這個lab2有很大關聯,我還是不要趕進度,先弄懂lab2的細節先【2016年8月2日 21:59:54】