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】