ucore学习笔记_LAB2

练习1:实现 first-fit 连续物理内存分配算法

关键数据结构:

struct list_entry {
    struct list_entry *prev, *next; //父节点,子节点
};

typedef struct list_entry list_entry_t; //重命名
typedef struct {
    list_entry_t free_list; //链表头部        
    unsigned int nr_free;   //空闲块的个数    
} free_area_t; //链表头部结构

struct Page {
    int ref;       //映射此物理页的虚拟页的个数       
    uint32_t flags; //物理页属性    
    unsigned int property;  //连续空页有多少(只在地址最低页有值)
    list_entry_t page_link; // 双向链接各个Page结构的page_link
};

练习2:实现寻找虚拟地址对应的页表项

逻辑地址结构及重要的宏:

// A linear address 'la' has a three-part structure as follows:
//
// +--------10------+-------10-------+---------12----------+
// | Page Directory |   Page Table   | Offset within Page  |
// |      Index     |     Index      |                     |
// +----------------+----------------+---------------------+
//  \--- PDX(la) --/ \--- PTX(la) --/ \---- PGOFF(la) ----/
//  \----------- PPN(la) -----------/
//

// page directory index
#define PDX(la) ((((uintptr_t)(la)) >> PDXSHIFT) & 0x3FF)
// page table index
#define PTX(la) ((((uintptr_t)(la)) >> PTXSHIFT) & 0x3FF)
// page number field of address
#define PPN(la) (((uintptr_t)(la)) >> PTXSHIFT)
// offset in page
#define PGOFF(la) (((uintptr_t)(la)) & 0xFFF)

练习3:释放某虚地址所在的页并取消对应二级页表项的映射

static inline void
page_remove_pte(pde_t *pgdir, uintptr_t la, pte_t *ptep) {
if (*ptep & PTE_P) {  //页表项存在
        struct Page *page = pte2page(*ptep); //找到页表项
        if (page_ref_dec(page) == 0) {  //只被当前进程引用
            free_page(page); //释放页
        }
        *ptep = 0; //该页目录项清零
        tlb_invalidate(pgdir, la); 
        //修改的页表是进程正在使用的那些页表,使之无效
    }
}
原文地址:https://www.cnblogs.com/obob/p/11715352.html