(5)从零开始的操作系统开发日记

LAB2好难啊啊啊啊啊啊啊!!


  1. 其实我对整个LAB2的很多细节至今还没有弄明白,下面的内容如有大面积错误属正常现象,如有发现,请联系博主退货。╯﹏╰
  2. 虚拟地址映射关系:虚拟=物理+0xC0000000
  3. 目前内核大小限制在4M!【实际上3M】
  4. 关于练习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所在二级页表对应项的入口虚拟地址【?】
  5. 页表项中存放的是线性地址
  6. 关于练习2:
  7. 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)];
  8. 练习一中说到要重新实现default_pmm_xx()系列的函数,提供的参考实现不完全正确。但是我参照过答案和参考两个版本,就编写的便捷性,优雅度,性能来说都是提供的参考版本要好orz【这里很有可能是我没有找到参考版本的BUG】参考版本的链表结点只有连续空闲页的第一项,但是答案版本好像把所有页作为结点连起来了,完全不是一个次元的操作量啊,,,难道是有我没有看出来的BUG????!!!
  9. 说实话其实练习不至于很难,基本上在翻译注释,难就难在你需要大量的阅读他提供的宏和函数,理解整个内存管理,尤其是段页式的具体实现,代码的具体实现比想象中的要复杂,跟配套宏和函数的熟悉程度有关。虽然说lab2是很勉强的完成了但是感觉没弄懂的地方还是太多了,后面的lab3是虚拟内存,想必跟这个lab2有很大关联,我还是不要赶进度,先弄懂lab2的细节先【2016年8月2日 21:59:54】
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值