在os中,物理内存一般以页(一页,一般为4096字节)进行分配和管理。 在riscv-xv6中实现了三级页表机制:level2,level1,level0。sv39的寻址方式中,virtual address由9+9+9(三级页表项,每一级页表的directory有2^9=512项PTE条目,PTE的组成为(reserved(10bit)+PPN(44bit)+flags(10bit))。其中标记位为PTE_R,PT...
在os中,物理内存一般以页(一页,一般为4096字节)进行分配和管理。 在riscv-xv6中实现了三级页表机制:level2,level1,level0。sv39的寻址方式中,virtual address由9+9+9(三级页表项,每一级页表的directory有2^9=512项PTE条目,PTE的组成为(reserved(10bit)+PPN(44bit)+flags(10bit))。其中标记位为PTE_R,PT...
1、入口_entry的汇编代码见entry.S[2],_entry的代码会加载在kernel加载到内存的起始位置0x80000000,每个hart(hart 的全称是 Hardware Thread,即硬件线程。在 xv6 操作系统中,hart 通常用于表示一个 CPU 核心)会调用start.c的代码执行。在 xv6 操作系统中,stack0 是一个用作临时工作栈的区域(其为全局变量,在内...
LRU采用了双向循环链表进行的实现,完整实现思路可以参考[2],但在riscv-xv6的实现中没有用到哈希函数,而是采用遍历的方式进行的查找,riscv-xv6中的具体的实现参考[3],当前的head节点为最近访问的节点(哨兵节点),head节点的前驱节点为最久未使用的节点,而后继节点为离当前head最近时间使用过的节点,依此类推。在缓...
git clone git://github.com/mit-pdos/xv6-riscv.git 进入xv6目录下进行编译,并启动qemu仿真运行: make qemu 运行结果如下图: 在xv6命令行下,输入ls,看到正确回应,那么恭喜你,至此运行环境已经设置成功。 如果要退出qemu, 按下Ctrl 键和A键, 然后释放这两个键,再按X键即可退出 ...
包括xv6在内的大多数内核都会交错的执行多个活动,一个原因来自于多处理器硬件:计算机有多个独立运行的CPU,比如xv6的RISC-V,这些CPU共享物理内存,并且xv6利用这一点来维护被所有CPU共同读写的数据结构。这种共享提高了在一个CPU正在更新数据结构的过程中另一个CPU读取该数据结构的可能,或者只是多个CPU在同时更新相同的...
Risc-V Xv6 Syscall Procedure Risc-V Xv6 Syscall Procedure User syscall function loads corresponding syscall number into registera7, then executeecall. Whatecalldoes in risc-v are basically 3 things: Change user mode into super mode. Save program counter inpcintosepc....
大部分用于操作地址空间和页表的 xv6 代码都在vm.c(kernel/vm.c:1)中。核心数据结构是pagetable_t,它实际上是一个指向 RISC-V 根页表页的指针;pagetable_t可以是内核页表,也可以是进程的页表。核心函数是walk和mappages,前者通过虚拟地址得到 PTE,后者将虚拟地址映射到物理地址。以kvm开头的函数操作内核页表;以...
Xv6经常使用参与等待的内核数据结构的地址。 Sleep首先获取p->lock (kernel/proc.c:559)。现在进入睡眠状态的进程同时持有p->lock和lk。在调用者(在本例中为P)中,持有lk是必要的:它保证了没有其他进程(在本例中,运行V的进程)可以调用wakeup(chan)。现在sleep持有p->lock...
这个系列的目的还是以讲解xv6-riscv的代码以及记录我在做的事情为主,也会掺杂许多mini-riscv-os的代码介绍(关于xv6-riscv和mini-riscv-os的链接请看参考),并非教程倾向(但也会尽可能讲解一些基础知识),很多细节不会讲到。如果想要更详细的教程我建议你查看参考资料中