在riscv-xv6中实现了三级页表机制:level2,level1,level0。sv39的寻址方式中,virtual address由9+9+9(三级页表项,每一级页表的directory有2^9=512项PTE条目,PTE的组成为(reserved(10bit)+PPN(44bit)+flags(10bit))。其中标记位为PTE_R,PTE_W,PTE_X等,如果这三项都没有标记,则表示该PTE不是叶子PTE,可...
在riscv-xv6中实现了三级页表机制:level2,level1,level0。sv39的寻址方式中,virtual address由9+9+9(三级页表项,每一级页表的directory有2^9=512项PTE条目,PTE的组成为(reserved(10bit)+PPN(44bit)+flags(10bit))。其中标记位为PTE_R,PTE_W,PTE_X等,如果这三项都没有标记,则表示该PTE不是叶子PTE,可...
pub fn flags(&self) -> PTEFlags { PTEFlags::from_bits(self.bits as u8).unwrap() } pub fn is_valid(&self) -> bool { (self.flags() & PTEFlags::V) != PTEFlags::empty() } pub fn readable(&self) -> bool { (self.flags() & PTEFlags::R) != PTEFlags::empty() } pub fn...
intkvmcopy(pagetable_told,pagetable_tnew, uint64 st, uint64 en){pte_t*pte; uint64 pa, i; uint flags;if(en > PLIC)return-1; st = PGROUNDUP(st);for(i = st; i < en; i += PGSIZE) {if((pte = walk(old, i,0)) ==0) panic("kvmcopy: pte should exist");if((*pte & ...
*pte = PA2PTE((uint64)mem) | flags; kfree((void*)pa);return0; } 然后就是copyout函数的修改,为什么不需要修改copyin和copyinstr函数呢,因为fork涉及的都是用户区的内存,所以缺页也只会在写用户内存的情况下发生,copyout是内核内存写到用户内存,所以需要处理,另外两个函数是用户内存写到内核内存,是读用户...
void set_pte(pte_t *pte, uint64_t pa, uint64_t flags) { //以物理地址的低 12 位是页内偏移,不需要存储在 PTE 中。 // PTE 的物理页号(PPN)字段从第 10 位开始,因此需要将物理页号对齐到 PTE 的正确位置。 *pte = (pa >> 12) << 10 | flags; ...
unsigned long flags; unsigned long *rmap; 分配该块物理内存对应的host内核虚拟地址(vmalloc分配) unsigned long *dirty_bitmap; struct { unsigned long rmap_pde; int write_count; } *lpage_info[KVM_NR_PAGE_SIZES - 1]; unsigned long userspace_addr; 用户空间地址(QEMU) ...
procinit(kernel/proc.c:26),它由main调用,为每个进程分配一个内核栈。它将每个栈映射在KSTACK生成的虚拟地址上,这就为栈守护页留下了空间。kvmmap将对应的PTE加入到内核页表中,然后调用kvminithart将内核页表重新加载到satp中,这样硬件就知道新的 PTE 了。
由于内核已经更新了相关的PTE以允许写入,所以错误指令现在将正确执行。 COW策略对fork很有效,因为通常子进程会在fork之后立即调用exec,用新的地址空间替换其地址空间。在这种常见情况下,子级只会触发很少的页面错误,内核可以避免拷贝父进程内存完整的副本。此外,COW fork是透明的: 无需对应用程序进行任何修改即可使其受...
void__set_fixmap(enumfixed_addresses idx,phys_addr_tphys,pgprot_tprot){unsignedlongaddr = __fix_to_virt(idx);pte_t*ptep; BUG_ON(idx <= FIX_HOLE || idx >= __end_of_fixed_addresses);ptep = &fixmap_pte[pte_index(addr)];if(pgprot_val(prot))set_pte(ptep, pfn_pte(phys >> ...