Xv6为每个CPU维护了一个cpu结构体(kernel/proc.h:22),它记录了当前在该CPU上运行的进程(如果有的话),为CPU的调度线程保存的寄存器,以及管理中断禁用所需的嵌套自旋锁的计数。函数mycpu(kernel/proc.c:60)返回一个指向当前CPU结构体cpu的指针。RISC-V对CPU进行编号,给每个CPU一个hartid。Xv6确保每个CPU的hartid...
xv6-riscv 启动 xv6 启动主要完成 C 语言运行相关 stack 建立,并从 M 态 跳转到 S 态,为内核初始化做环境准备。 1、启动 通过链接文件 kernel.ld 文件,发现入口函数是_entry,在 entry.S 文件中定义,函数很简单 # qemu -kernel loads the kernel at 0x80000000 # and causes each hart (i.e. CPU) to...
xv6 在结构和风格上与 v6 有一定的相似之处,但是它是使用 ANSI C 针对现代的 RISC-V 多处理器进行实现的。 1、下载 $ git clone https://github.com/mit-pdos/xv6-riscv xv6-riscv 项目目录非常简洁,只有3个目录,分别为 kernel、mkfs、user 目录和1个 Makefile 文件 tree . ├── kernel │ ├─...
如图 2.3 所示,一个进程的用户内存从虚拟地址 0 开始,可以增长到MAXVA(kernel/riscv.h:348),原则上允许一个进程寻址 256GB 的内存。 当一个进程要求 xv6 提供更多的用户内存时,xv6 首先使用kalloc来分配物理页,然后将指向新物理页的 PTE 添加到进程的页表中。Xv6 设置这些 PTE 的PTE_W、PTE_X、PTE_R、PT...
包括xv6在内的大多数内核都会交错的执行多个活动,一个原因来自于多处理器硬件:计算机有多个独立运行的CPU,比如xv6的RISC-V,这些CPU共享物理内存,并且xv6利用这一点来维护被所有CPU共同读写的数据结构。这种共享提高了在一个CPU正在更新数据结构的过程中另一个CPU读取该数据结构的可能,或者只是多个CPU在同时更新相同的...
在trampoline页面,usertrapret保存了tp,因为用户进程可能修改tp。最后,当从用户空间进入内核时(kernel/trampoline.S:70)uservec恢复保存的tp。编译器保证永远不会使用tp寄存器。如果RISC-V允许xv6直接读取当前的hartid将会更加方便,但是这只在机器模式下被允许,在supervisor模式下则不行。
xv6-riscv/kernel/console.c:87:(.text+0x84): relocation truncated to fit: R_RISCV_HI20 against `.LANCHOR0' ... 意思是,函数 xxx 里面,某个需要重定位的地址超过了R_RISCV_HI20能够支持的范围,即超过了 2G(因为默认是medlow模式)。原因是,我们在链接的时候,把 text 段放在了0x80000000(= 2^31...
xv6-riscv/kernel/entry.S 代码语言:javascript 复制 # qemu-kernel loads the kernel at0x80000000# and causes eachhart(i.e.CPU)to jump there.# kernel.ld causes the following code to # be placed at0x80000000..section.text.global _entry_entry:#setup a stackforC.# stack0 is declaredinstart...
上图就是 riscv sv39 的物理地址空间,在这个地址空间上,KERNBASE之下的地址空间,用于一些硬件 IO 接口,而KERNBASE 及以上的地址空间,用于物理内存。所以在 xv6 里,物理内存的地址并不是从 0 开始的,而是从 KERNBASE 开始的。 理解PHYSTOP的含义 #definePHYSTOP (KERNBASE + 128*1024*1024) ...
xv6riscv是一个基于RISC-V指令集架构的操作系统,它是xv6操作系统的一个变种。xv6是一个教学用的UNIX类操作系统,旨在帮助学生理解操作系统的设计和实现原理。xv6riscv保留了xv6的设计理念和结构,但将其移植到了RISC-V架构上。xv6riscv具有简洁、清晰的代码结构,易于理解和学习。它实现了操作系统的核心功能,包括进程...