首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

6.S0816.828: xv6源码分析--trap机制

跳转到STVEC指向的代码,也就是trampoline page中,这个是从supervisor mode返回user mode时设置的。...图片3 trampoline.uservec之前讲解过用户页表的布局,虚拟地址最高处的几页比较特殊,trampoline是trap代码,系统调用进入内核的必经之路,此时会执行trampoline.S中uservec...代码进行保存用户寄存器到trapframe,并将trapframe中的内核参数设置到指定寄存器,trampoline这一页每个进程都有,共享同一个物理页,但是trampoline这一页没有PTE_U,不能被用户态执行...intr_off(); // send syscalls, interrupts, and exceptions to trampoline.S w_stvec(TRAMPOLINE + (uservec...uint64 fn = TRAMPOLINE + (userret - trampoline);//执行trampoline.userret代码段,这两个参数分别放到a0、a1寄存器中 ((void

92752

泛函编程(30)-泛函IO:Free Monad-Monad生产线

在上节我们介绍了Trampoline。它主要是为了解决堆栈溢出(StackOverflow)错误而设计的。...Trampoline类型是一种数据结构,它的设计思路是以heap换stack:对应传统递归算法运行时在堆栈上寄存程序状态,用Trampoline进行递归算法时程序状态是保存在Trampoline的数据结构里的...所以IO算法设计也会采用与Trampoline一样的数据结构。或者我们应该沿用Trampoline数据结构和算法来设计IO组件库。如此思考那么我们就必须对Trampoline进行深度抽象了。...,) 7 8 prg.foldMap(TestConsole) 在上一节我们讨论了Trampoline。主要目的是解决泛函算法中不可避免的堆栈溢出问题。...我们应该考虑在Free Monad里使用Trampoline类型。这样我们才可以放心地用Free Monad来产生任何类型的Monad并在运算中以heap换stack解决堆栈溢出问题。

1.1K70

泛函编程(31)-泛函IO:Free Monad-Running free

前面我们介绍了Trampoline的运算模式可以有效解决堆栈溢出问题,而上节的Free Monad介绍里还没有把Free Monad与Trampoline运算模式挂上钩。...我们先考虑一下如何在Free Monad数据类型里引入Trampoline运算模式。...[A] { 14 private case class FlatMap[B](a: Trampoline[A], f: A => Trampoline[B]) extends Trampoline[...[A] 38 case class More[A](k: () => Trampoline[A]) extends Trampoline[A] 这两个数据类型的设计目的都是为了能逐步运行算法:按照算法运算的状态确定下一步该如何运行...为了实现Free Monad在运行中采用Trampoline运行机制,我们可以像Trampoline数据类型一样来实现resume,这个确定每一步运算方式的函数: 1 trait Free[F[_],

1.2K100

MIT 6.S081 (BOOK-RISCV-REV1)教材第四章内容 --Trap -- 中

fn函数是就是刚刚我向你展示的位于trampoline.S中的代码。 程序现在仍然在trampoline的最开始,也就是uservec函数的最开始,我们基本上还没有执行任何内容。...因为我们还在trampoline代码中,而trampoline代码在用户空间和内核空间都映射到了同一个地址。...在下一行我们设置了STVEC寄存器指向trampoline代码,在那里最终会执行sret指令返回到用户空间。位于trampoline代码最后的sret指令会重新打开中断。...为什么trampoline代码中不保存SEPC寄存器? trampoline代码没有像其他寄存器一样保存这个寄存器,但是非常欢迎大家修改XV6来保存它。...实际上,我们会在汇编代码trampoline中完成page table的切换,并且也只能在trampoline中完成切换,因为只有trampoline中代码是同时在用户和内核空间中映射。

27540

MIT 6.S081 (BOOK-RISCV-REV1)教材第四章内容 --Trap -- 上

. // 为进程的用户态页表分配一个新的空闲物理页--同时做好TRAMPOLINETRAMPOLINE的映射 // TRAMPOLINETRAMPOLINE这两部分代码是上下文切换通用代码,...usertrapret函数中会执行S态返回用户态的操作: //proc.c //这三个外部全局遍历定义在trampoline.s中 extern char trampoline[], uservec[...(TRAPFRAME, satp); } trampoline,uservec,userret是定义在trampoline.S中的三个全局符号,其中trampoline 符号是一个占位符标记,并不包含任何指令地址...xv6使用包含uservec的蹦床页面(trampoline page)来满足这些约束。xv6将蹦床页面映射到内核页表和每个用户页表中相同的虚拟地址。这个虚拟地址是TRAMPOLINE。...蹦床内容在trampoline.S中设置,并且(当执行用户代码时)stvec设置为uservec (kernel/trampoline.S:16)。

36720

MIT_6.s081_Information2:Trap&Syscall

页,trampoline就是以个特殊的页,这个页包含了uservec和userret两部分,并且这个页存在于所有进程的页表,自然也存在于内核态空间下的页表.并且这个页是分配在虚拟地址空间的最后一个部分,...这个trampoline页存在于任何一个进程和内核的页表,并且映射的虚拟地址都是一样的,定义在TRAMPOLINE这个C语言宏中.并且stvec这个寄存器存储的地址,就指向trampoline这个页的uservec...intr_off(); // send syscalls, interrupts, and exceptions to trampoline.S w_stvec(TRAMPOLINE + (uservec...w_sepc(p->trapframe->epc); // tell trampoline.S the user page table to switch to....uint64 fn = TRAMPOLINE + (userret - trampoline); ((void (*)(uint64,uint64))fn)(TRAPFRAME, satp); }

42130
领券