(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】
發佈了28 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章