int p[2];char*argv[2];argv[0]="wc";argv[1]=0;//p数组接收创建得到的管道的输入输出文件描述符号//p0用于读,p1用于写//假设父进程此时只打开了0,1,2三个文件描述符,那么p0和p1分别占用3和4号描述符pipe(p);if(fork()==0){//子进程关闭默认的0号标准输入close(0);//让管道的读端作为新的...
内核执行时有一个时间窗口(usertrapret),将stvec设置为uservec,在该窗口中禁用设备中断至关重要。幸运的是,RISC-V总是在开始设置陷阱时禁用中断,xv6在设置stvec之前不会再次启用中断。 页面错误异常 Xv6对异常的响应相当无趣: 如果用户空间中发生异常,内核将终止故障进程。如果内核中发生异常,则内核会崩溃。真正的...
一个进程可以通过执行RISC-V的ecall指令进行系统调用,该指令提升硬件特权级别,并将程序计数器(PC)更改为内核定义的入口点,入口点的代码切换到内核栈,执行实现系统调用的内核指令,当系统调用完成时,内核切换回用户栈,并通过调用sret指令返回用户空间,该指令降低了硬件特权级别,并在系统调用指令刚结束时恢复执行用户指令。
整个CPU和MMU都在处理器芯片中,所以在一个RISC-V芯片中,有多个CPU核,MMU和TLB存在于每一个CPU核里面。RISC-V处理器有L1 cache,L2 Cache,有些cache是根据物理地址索引的,有些cache是根据虚拟地址索引的,由虚拟地址索引的cache位于MMU之前,由物理地址索引的cache位于MMU之后。 操作系统不需要知道TLB是如何工作的 —...
对于保存用户寄存器,XV6在RISC-V上的实现包括了两个部分: 第一个部分是,XV6在每个user page table映射了trapframe page,这样每个进程都有自己的trapframe page。 这个page包含了很多有趣的数据,但是现在最重要的数据是用来保存用户寄存器的32个空槽位。
RISC-V陷入机制 每个RISC-V CPU都有一组控制寄存器,内核通过向这些寄存器写入内容来告诉CPU如何处理陷阱,内核可以读取这些寄存器来明确已经发生的陷阱。RISC-V文档包含了完整的内容。riscv.h(kernel/riscv.h:1)包含在xv6中使用到的内容的定义。以下是最重要的一些寄存器概述: ...