mepc 用于存储程序从异常服务程序退出时要返回的程序计数器值 */// disable paging for now.w_satp(0);/* 设置 MMU 地址转换寄存器 SATP = 0, 关闭 MMU */// delegate all interrupts and exceptions to supervisor mode.w_medeleg(0xffff);/* 设置机器模式异常降级控制寄存器 MEDELEG */w_mideleg(0x...
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 │ ├─...
voidbinit(void){structbuf*b;initlock(&bcache.lock,"bcache");// Create linked list of buffersbcache.head.prev=&bcache.head;bcache.head.next=&bcache.head;for(b=bcache.buf;b<bcache.buf+NBUF;b++){b->next=bcache.head.next;b->prev=&bcache.head;initsleeplock(&b->lock,"buffer");bcache...
code:https://github.com/mit-pdos/xv6-riscv book:https://pdos.csail.mit.edu/6.828/2021/xv6/book-riscv-rev2.pdf note:https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/
Xv6 for RISC-V Resources Readme License View license Activity Custom properties Stars 6.8kstars Watchers 94watching Forks 2.5kforks Report repository Releases No releases published Packages No packages published Contributors32 + 18 contributors
意思是,函数 xxx 里面,某个需要重定位的地址超过了R_RISCV_HI20能够支持的范围,即超过了 2G(因为默认是medlow模式)。原因是,我们在链接的时候,把 text 段放在了0x80000000(= 2^31 = 2G),我们所有的代码都超过了 2G: # kernel/kernel.ldSECTIONS{/* ...
上图就是 riscv sv39 的物理地址空间,在这个地址空间上,KERNBASE之下的地址空间,用于一些硬件 IO 接口,而KERNBASE 及以上的地址空间,用于物理内存。所以在 xv6 里,物理内存的地址并不是从 0 开始的,而是从 KERNBASE 开始的。 理解PHYSTOP的含义 #definePHYSTOP (KERNBASE + 128*1024*1024) ...
函数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...
首先看一下C语言下的数据类型在risc-v下所占据的大小,如下图:可以看出除了long和void*的大小是和平台有关,其他类型无论是在32位还是64位平台上,他们的大小都是一样的。 函数调用规范在risc-v平台上,有8 ucore OS简介 Frans Kaashoek等在2006年参考PDP-11上的UNIX Version6写了一个可在X86上跑的操作系统xv6...
源码GitHub连接:GitHub - mit-pdos/xv6-riscv: Xv6 for RISC-Vgithub.com/mit-pdos/xv6-risc...