上一节寒剑默听奔雷声:XV6 系统调用(二)/ trap(一)介绍了,简单介绍了XV6的中断机制,并且以系统调用的流程为例看了下代码。本节将介绍另一种中断类型:定时器中断。 系统调用涉及了用户态到内核态的转换,用户寄存器状态的保存等,较为琐碎。定时器中断流程上则较为简单,但是这里不得不涉及更多的关于RISCV中断处理的前置知
xv6为每个CPU(kernel/proc.h:22)维护了一个struct cpu,它可以记录当前运行在CPU上的进程(如果有),记录为CPU调度线程保存的寄存器,以及嵌套的自旋锁的个数,我们需要使用它管理中断的禁用。mycpu函数(kernel/proc.c:60)返回一个指向当前CPU的struct cpu的指针。RISC-V为它的CPU编号,给每一个CPU一个hartid。xv6...
如图 2.3 所示,一个进程的用户内存从虚拟地址 0 开始,可以增长到MAXVA(kernel/riscv.h:348),原则上允许一个进程寻址 256GB 的内存。 当一个进程要求 xv6 提供更多的用户内存时,xv6 首先使用kalloc来分配物理页,然后将指向新物理页的 PTE 添加到进程的页表中。Xv6 设置这些 PTE 的PTE_W、PTE_X、PTE_R、PT...
riscv-xv6是基于多核的riscv指令架构的教学用操作系统的实现,这篇短文将在已有相关启动流程介绍[1]的基础上补充介绍riscv-xv6。 1、入口_entry的汇编代码见entry.S[2],_entry的代码会加载在kernel加载到内存的起…
包括xv6在内的大多数内核都会交错的执行多个活动,一个原因来自于多处理器硬件:计算机有多个独立运行的CPU,比如xv6的RISC-V,这些CPU共享物理内存,并且xv6利用这一点来维护被所有CPU共同读写的数据结构。这种共享提高了在一个CPU正在更新数据结构的过程中另一个CPU读取该数据结构的可能,或者只是多个CPU在同时更新相同的...
本篇文章将简要介绍内核页表和用户进程页表的机制,页表实现了内存的虚拟地址到物理地址的转换,虚拟地址机制实现了进程之间物理存储空间的隔离。在os中,物理内存一般以页(一页,一般为4096字节)进行分配和管理。 在riscv-xv6中实现了三级页表机制:level2,level1,level0。sv39的寻址方式中,virtual address由9+9+9(三...
riscv-xv6是基于多核的riscv指令架构的教学用操作系统的实现,这篇短文将在已有相关启动流程介绍[1]的基础上补充介绍riscv-xv6。 1、入口_entry的汇编代码见entry.S[2],_entry的代码会加载在kernel加载到内存的起始位置0x80000000,每个hart(hart 的全称是 Hardware Thread,即硬件线程。在 xv6 操作系统中,hart 通...
函数mycpu(kernel/proc.c:60)返回一个指向当前CPU结构体cpu的指针。RISC-V对CPU进行编号,给每个CPU一个hartid。Xv6确保每个CPU的hartid在内核中被存储在该CPU的tp寄存器中。这使得mycpu可以使用tp对cpu结构体的数组进行索引,从而找到正确的cpu。 确保一个CPU的tp始终保持CPU的hartid是有一点复杂的。mstart在CPU...
xv6-riscv/kernel/entry.S 代码语言:javascript 代码运行次数:0 运行 AI代码解释 # qemu -kernel loads the kernel at 0x80000000 # and causes each hart (i.e. CPU) to jump there. # kernel.ld causes the following code to # be placed at 0x80000000. .section .text .global _entry _entry: #...
xv6 loosely follows the structure and style of v6, but is implemented for a modern RISC-V multiprocessor using ANSI C. ACKNOWLEDGMENTS xv6 is inspired by John Lions's Commentary on UNIX 6th Edition (Peer to Peer Communications; ISBN: 1-57398-013-7; 1st edition (June 14, 2000)). See ...