ptep = get_pte(mm->pgdir,addr,1);
if(*ptep == 0){
struct Page *page = pgdir_alloc_page(mm->pgdir,addr,perm);
set_page_ref(page,1);
int pa = page2pa(page) & ~0x0fff;
memset((void *)KADDR(pa),0,PGSIZE);
*ptep = pa | PTE_P | PTE_W | PTE_U;
}
else{
if(swap_init_ok){
struct Page *page=NULL;
swap_in(mm,addr,&page);//缺页时陷入中断,腾出至少一页空间后进入到这,把缺页调入
page_insert(mm->pgdir,page,addr, perm);//更新页表
swap_map_swappable(mm,addr,page,1);// 加入调度队列
page->pra_vaddr = addr;//逻辑地址指向虚拟地址
}
else{
cprintf("no swap_init_ok but ptep is %x, failed\n",*ptep);
goto failed;
}
}
页面置换算法
最新推荐文章于 2023-10-03 15:59:35 发布