PhysAddr::from(strampoline as usize).into(), PTEFlags::R | PTEFlags::X, ); } TRAMPOLINE:一个虚拟地址 pub const TRAMPOLINE: usize = usize::MAX - PAGE_SIZE + 1; pub const TRAP_CONTEXT: usize = TRAMPOLINE - PAGE_SIZE; strampoline 是内核结束之后的一个物理地址 stext = .; .text : ...
void set_pte(pte_t *pte, uint64_t pa, uint64_t flags) { //以物理地址的低 12 位是页内偏移,不需要存储在 PTE 中。 // PTE 的物理页号(PPN)字段从第 10 位开始,因此需要将物理页号对齐到 PTE 的正确位置。 *pte = (pa >> 12) << 10 | flags; } int main() { // 假设页表的基地...
unsigned long npages; 该块物理内存块占用的page数 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_ad...
inthandle_page(uint64 va,pagetable_tpgtbl){pte_t*pte;char*mem; uint flags;if((pte = walk(pgtbl, va,0)) ==0)return-1;if((*pte & PTE_C) ==0)return-1;if((mem = kalloc()) ==0)return-1; flags = PTE_FLAGS((*pte & (~PTE_C)) | PTE_W); uint64 pa = PTE2PA(*pte)...
LED_STS——PTE0 所以我们需要配置PTA22/PTA23/PTA24为普通推挽输出方式,然后输出高低电平就可以控制LED闪烁了。 led_driver.c文件内容 #include "led_driver.h" void LED_RGB_Init(void) { gpio_pin_config_t io_init; port_pin_config_t config; ...
procinit(kernel/proc.c:26),它由main调用,为每个进程分配一个内核栈。它将每个栈映射在KSTACK生成的虚拟地址上,这就为栈守护页留下了空间。kvmmap将对应的PTE加入到内核页表中,然后调用kvminithart将内核页表重新加载到satp中,这样硬件就知道新的 PTE 了。
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) ...
PTE_W控制是否允许指令写入到页面。 PTE_X控制CPU是否可以将页面内容解释为指令并执行它们。 PTE_U控制用户模式下的指令是否被允许访问页面; 如果没有设置PTE_U,PTE只能在管理模式下使用。 图3.2显示了它是如何工作的。标志和所有其他与页面硬件相关的结构在(*kernel/riscv.h*)中定义。
Cancel Create saved search Sign in Sign up {{ message }} riscv-software-src / riscv-isa-sim Public Notifications You must be signed in to change notification settings Fork 796 Star 2.3k Code Issues 244 Pull requests 37 Actions Projects ...
由于内核已经更新了相关的PTE以允许写入,所以错误指令现在将正确执行。 COW策略对fork很有效,因为通常子进程会在fork之后立即调用exec,用新的地址空间替换其地址空间。在这种常见情况下,子级只会触发很少的页面错误,内核可以避免拷贝父进程内存完整的副本。此外,COW fork是透明的: 无需对应用程序进行任何修改即可使其受...