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); //修改的页表是进程正在使用的那些页表,使之无效 } }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步